bash - 如何在 shell if 语句中表示多个条件?

标签 bash shell unix

我想像这样表示多个条件:

if [ ( $g -eq 1 -a "$c" = "123" ) -o ( $g -eq 2 -a "$c" = "456" ) ]   
then  
    echo abc;  
else  
    echo efg;   
fi  

但是当我执行脚本时,它显示

syntax error at line 15: `[' unexpected,

第 15 行显示的是如果......

这种情况有什么问题?我猜 () 有问题。

最佳答案

经典技术(转义元字符):

if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]
then echo abc
else echo efg
fi

我用双引号将对 $g 的引用括起来;一般来说,这是很好的做法。严格来说,不需要括号,因为 -a-o 的优先级使得即使没有它们也是正确的。

请注意,-a-o 运算符是 test 的 POSIX 规范的一部分,又名 [,主要是为了向后兼容(例如,因为它们是第 7 版 UNIX 中 test 的一部分),但它们被 POSIX 明确标记为“过时”。 Bash(参见 conditional expressions )似乎用它自己的带参数的替代运算符抢占了 -a-o 的经典和 POSIX 含义。


您可以谨慎使用更现代的 [[ 运算符,但请注意 Bash 和 Korn Shell(例如)中的版本不必相同。

for g in 1 2 3
do
    for c in 123 456 789
    do
        if [[ ( "$g" -eq 1 && "$c" = "123" ) || ( "$g" -eq 2 && "$c" = "456" ) ]]
        then echo "g = $g; c = $c; true"
        else echo "g = $g; c = $c; false"
        fi
    done
done

运行示例,在 Mac OS X 上使用 Bash 3.2.57:

g = 1; c = 123; true
g = 1; c = 456; false
g = 1; c = 789; false
g = 2; c = 123; false
g = 2; c = 456; true
g = 2; c = 789; false
g = 3; c = 123; false
g = 3; c = 456; false
g = 3; c = 789; false

您不需要像使用 [ 那样在 [[ 中引用变量,因为它不像 [ 那样是一个单独的命令 是。


Isn't it a classic question?

我也是这么想的。然而,还有另一种选择,即:

if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]
then echo abc
else echo efg
fi

事实上,如果您阅读了 autoconf 工具或相关包的“可移植 shell”指南,这种表示法 — 使用“||”和“&&” ' — 是他们推荐的。我想你甚至可以做到:

if [ "$g" -eq 1 ] && [ "$c" = "123" ]
then echo abc
elif [ "$g" -eq 2 ] && [ "$c" = "456" ]
then echo abc
else echo efg
fi

如果 Action 像 echo 一样微不足道,这还不错。当要重复的 Action block 是多行时,重复太痛苦了,最好使用较早的版本之一——或者您需要将 Action 包装到一个函数中,该函数在不同的 then block 中调用.

关于bash - 如何在 shell if 语句中表示多个条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3826425/

相关文章:

php shell_exec bash.exe 在 Window XP IIS 中不工作

shell - 如何在 make Recipe 中使用 for 循环

bash - 通过命令行检查 BitBucket 存储库是否存在

unix - 在 Unix 中对 ls-l 所有者进行排序

linux - "zip -m"目录变空不删除

bash - bash 中 ${foo :? } 中的 "?"是什么意思?

linux 文件和文件夹不继承父目录权限

c++ - Unix 用户空间中的实时 IPC

c - 如何使用read()读取数据直到文件末尾?

javascript - 你如何使用 JavaScript 在 QtQuick Qml 中进行大量数学运算