shell脚本:`[[`没有按预期工作

时间:2014-03-28 07:46:09

标签: 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 $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 ]] &&

然后一切都很好。

我尝试删除&符号(&),尝试其他条件(正如您在示例中所见),尝试而不是[[ - 但都是徒劳。

任何条件都不起作用

1 个答案:

答案 0 :(得分:2)

[[ ... ]]出现在大多数高级shell(kshbashzsh)中,但在POSIX sh和Ubuntu {{1}中缺失(/bin/sh的符号链接。

您可以将/bin/dash替换为[[ ... ]][ ... ](两者都是等效的,第二个清楚地表明test ...是一个命令而test出现时就好像它是特殊语法),或者(除非将脚本显式调用为[ ... ]),以sh FILENAME启动它。请注意,#!/bin/bash的解析方式与[[ ... ]]test不同,因为[ ... ]是保留字,而[[[仅仅是内置命令。具体来说,在test[[之间不进行字段拆分和通配,而如果两个字符串都没有引用,则此上下文中的]]=会进行shell模式匹配。此外,===~中不存在执行正则表达式匹配的test运算符。