2014-03-28 59 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[中。