【问题标题】:shell script: `[[` not working as expectedshell脚本:`[[`没有按预期工作
【发布时间】:2014-05-07 13:39:56
【问题描述】:

我有一个脚本:

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

任何条件都不行

【问题讨论】:

  • 你可以说:"$ENABLE_SYSLOG" && ...
  • 哦,谢谢。这太棒了
  • 虽然这看起来很聪明,但它可能不是一个好主意。您应该尝试找出为什么您的尝试不起作用,因为它应该。您使用的是哪个版本的bash?你如何运行脚本?
  • 这行得通。谢谢你的提示)
  • Ubuntu 确实使用dash,而不是bash,用于系统脚本,因此不支持[[

标签: upstart dash-shell


【解决方案1】:

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

您可以将[[ ... ]] 替换为[ ... ]test ...(两者是等价的,第二个清楚地表明test 是一个命令,而[ ... ] 似乎是特殊语法),或者(除非脚本被显式调用为sh FILENAME),否则以#!/bin/bash 开头。注意[[ ... ]]test[ ... ] 的解析方式不同,因为[[ 是保留字,而[test 只是内置命令。具体来说,[[]] 之间不会进行字段拆分和通配,而在此上下文中,=== 如果两个字符串都没有被引用,则执行 shell 模式匹配。此外,在test[ 中不存在用于进行正则表达式匹配的=~ 运算符。

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2012-02-06
    相关资源
    最近更新 更多