2014-03-28 3 views
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 ]] && 

을 제거하면

그런 다음 모든 것이 괜찮습니다.

앰퍼샌드 (&)를 제거하고 다른 조건을 시도해보십시오 (예를 들어 볼 수 있듯이) [[- 그러나 모두 헛되이 시도하십시오.

모든 조건은

+0

'$ ENABLE_SYSLOG "&& ...' – anubhava

+0

감사합니다. 이것은 굉장합니다 – vskubriev

+1

이것은 영리하게 보일지 모르지만, 아마도 좋은 생각이 아닙니다. 시도가 실패한 이유를 알아봐야합니다. 'bash'의 어떤 버전을 사용하고 있습니까? 스크립트를 어떻게 실행합니까? –

답변

2

[[ ... ]]는 가장 진보 된 쉘 (ksh, bashzsh)에 존재하지만, POSIX sh과 (/bin/dash에 심볼릭 링크) 우분투 /bin/sh에없는 것은 아닙니다.

당신도 [ ... ] 또는 test ..., 또는 (두 번째는 [ ... ]는 특수 구문 인 것처럼 표시되는 동안 test이 명령은 분명히 있다고한다, 동일)로 [[ ... ]]를 대체 할 수 있습니다 (스크립트가 명시 적으로 sh FILENAME로 호출하지 않는 한) #!/bin/bash으로 시작하십시오. 은 test 또는 [ ... ]과 다르게 구문 분석되며, 은 예약어이며 및 test은 단지 명령이 내장되어 있습니다. 특히 [[]] 사이에서 필드 분할 및 globbing이 수행되지 않으며 ===은 문자열이 인용되지 않으면 쉘 패턴 일치를 수행합니다. 또한 =~ 연산자는 test 또는 [에 정규 표현식 일치를 수행하지 않습니다.