2014-03-28 58 views
2

我有一个脚本不工作: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 ]] && 

然后一切都很好。

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

任何条件是不行的

+0

你可以说:'“$ ENABLE_SYSLOG”&& ...' – anubhava

+0

哦谢谢。这太棒了 – vskubriev

+1

虽然这看起来很聪明,但这可能不是一个好主意。你应该尝试找出为什么你的尝试不起作用,因为它应该。你使用的是什么版本的'bash'?你如何运行脚本? –

回答

2

[[ ... ]]存在于最先进的炮弹(kshbash,并zsh),但在POSIX sh和在Ubuntu /bin/sh(这是一个符号链接/bin/dash)丢失。

您可以用[ ... ]test ...(两者是等价的,第二清楚地表明,test是一个命令而出现[ ... ],就好像它是特殊的语法),或更换[[ ... ]](除非脚本明确援引为sh FILENAME) ,从#!/bin/bash开始。请注意,[[ ... ]]test[ ... ]的解析方式不同,因为[[是保留字,而[test仅仅是内置命令。具体而言,在[[]]之间没有进行字段拆分和匹配,而在此上下文中的===在两个字符串均未被引用的情况下执行shell模式匹配。此外,执行正则表达式匹配的=~运算符不存在于test[中。