我想像这样表示多个条件:
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/