2

我有一个脚本:

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 而不是 [[ - 但一切都是徒劳的。

任何条件都不行

4

1 回答 1

2

[[ ... ]]存在于大多数高级 shell(kshbash和)中,但在 POSIX和 Ubuntuzsh中缺失(这是指向 的符号链接)。sh/bin/sh/bin/dash

您可以替换[[ ... ]][ ... ]or test ...(两者是等效的,第二个清楚地表明这test是一个命令,而[ ... ]它看起来好像是特殊语法),或者(除非脚本被显式调用为sh FILENAME),以#!/bin/bash. 请注意,[[ ... ]]它的解析方式与testor不同[ ... ],它[[是保留字,而[andtest只是内置命令。具体来说,在 and 之间不进行字段拆分和通[[]],而===这种情况下,如果两个字符串都没有被引用,则进行 shell 模式匹配。此外,进行正=~则表达式匹配的运算符也不存在于testor中[

于 2014-07-23T02:22:16.103 回答