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