【问题标题】:Multiple unary operators in an if statement [duplicate]if语句中的多个一元运算符[重复]
【发布时间】:2011-01-19 13:43:58
【问题描述】:

if 语句中是否可以有多个一元运算符。这是给我错误的代码 sn-p。

请更正此处的代码。

if [ -f $input_file ] -a [ -f $output_file ] -a [ -f $log_file ] ]
then
    ### Some Code here
fi

【问题讨论】:

    标签: bash if-statement syntax unary-operator


    【解决方案1】:
    if [ -f "file1" -a -f "file2" -a "file3" ]; then
       #some code
    fi
    

    【讨论】:

    • 它就像一个魔术......感谢您的快速响应......
    【解决方案2】:

    [ 是一个命令,不是if 语句的一部分。因此,您应该将每个适当的参数传递给它,而不是像您一样尝试错误地运行它。

    if [ arg1 arg2 arg3 arg4 ... ]
    then
    

    【讨论】:

    • 在 Cygwin 环境中,有一个 C:\cygwin\bin\[.exe。第一次看这个文件夹感觉很奇怪。
    • 在大多数 Linux 发行版上,/usr/bin 中的类似命令 [,尽管 [ 通常是内置 bash。
    【解决方案3】:

    您只能将[ ... ] 运算符视为test ... 的快捷方式。选项的使用方式相同。

    因此,在您的情况下,您可以编写 ghostdog74 方式或:

    if [ -f $input_file ] && [ -f $output_file ] && [ -f $log_file ]
    then
    ### Some Code here
    fi
    

    【讨论】:

    • 将变量放在[ ... ] 内的双引号内很重要,以防止分词引起的事故以及变量评估为空的可能性。但是,在 Bash 特定的 [[ ... ]] 中,双引号是可选的。
    【解决方案4】:

    如果你使用 Bash 的双括号,你可以这样做:

    if [[ -f "$input_file" && -f "$output_file" && -f "$log_file" ]]
    

    我发现它比此处显示的其他选项更易于阅读(但这是主观的)。但是,它有other advantages

    而且,正如 ghostdog74 所示,您应该始终引用包含文件名的变量。

    【讨论】:

    • 如果您使用双括号,则不需要引用包含文件名的变量,因为 BASH 不使用双括号进行 WordSplitting。见mywiki.wooledge.org/BashFAQ/031
    猜你喜欢
    • 2020-12-31
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多