Upstart shell脚本:`[`未按预期工作
我有一个剧本:Upstart shell脚本:`[`未按预期工作,upstart,dash-shell,Upstart,Dash Shell,我有一个剧本: ENABLE_SYSLOG=true test -r /etc/default/inotifywait && . /etc/default/inotifywait || exit 99 test -d $INOTIFY_FOLDER || exit 100 inotifywait -mrq -e ATTRIB --format '%w%f' "$INOTIFY_FOLDER" | while IFS= read -r FILE do if [ -f $F
ENABLE_SYSLOG=true
test -r /etc/default/inotifywait && . /etc/default/inotifywait || exit 99
test -d $INOTIFY_FOLDER || exit 100
inotifywait -mrq -e ATTRIB --format '%w%f' "$INOTIFY_FOLDER" | while IFS= read -r FILE
do
if [ -f $FILE ];then
# If file
if [ `stat -c %a $FILE` != "664" ] ;then
CHMOD_LOG=$(chmod -v 664 "$FILE")
[[ "$ENABLE_SYSLOG" = true ]] && logger -t inotifywait -p user.info "$CHMOD_LOG" &
fi
else
# If directory
if [ `stat -c %a $FILE` != "2775" ] ;then
CHMOD_LOG=$(chmod -v 2775 "$FILE")
[[ "$ENABLE_SYSLOG" = true ]] && logger -t inotifywait -p user.info "$CHMOD_LOG" &
fi
fi
done
为什么是我的情况
[[ "$ENABLE_SYSLOG" = true ]] && logger -t inotifywait -p user.info "$CHMOD_LOG"
不工作
如果我删除
[[ "$ENABLE_SYSLOG" = true ]] &&
那么一切都好了
我尝试删除符号(&),尝试其他条件(如您在示例中所看到的),尝试if而不是[[-但都是徒劳的
在大多数高级shell(
ksh
、bash
、和zsh
)中,任何条件都不起作用,但在POSIXsh
和Ubuntu/bin/sh
(这是到/bin/dash
的符号链接)中都没有
您可以将
[…]
替换为[…]
或test…
(两者都是等效的,第二种方法明确说明test
是一个命令,而[…]
显示为特殊语法),或者(除非该脚本作为sh FILENAME
显式调用)请注意,[…]
的解析方式与测试或[…]
不同,因为[…]是一个保留字,而[
和
只是内置命令。具体来说,[
和]之间不进行字段拆分和全局搜索
,而在此上下文中,=
和=
如果两个字符串都没有被引用,则执行shell模式匹配。此外,=~
执行regexp匹配的操作符在test
或[
中不存在,您可以说:“$ENABLE\u SYSLOG”&&&…
噢,谢谢。这很了不起。虽然这看起来很聪明,但可能不是个好主意。你应该试着找出你的尝试不起作用的原因,因为它应该起作用。你使用的是什么版本的bash
?你如何运行脚本?这很有效。谢谢你的提示)Ubuntu确实使用了dash
,而不是bash
,for系统脚本,因此不支持[[
。