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

我想代表多个条件,例如:


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行显示的是....


这种情况怎么了?我猜这是有问题的()。


PIPIONE
浏览 6140回答 3
3回答

叮当猫咪

经典技术(转义元字符):if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]then echo abcelse echo efgfi我已经$g用双引号将引用括起来;一般来说,这是一个好习惯。严格来说,并不需要括号,因为的优先级-a,并-o使得它纠正,甚至没有他们。请注意,-aand -o运算符是testaka 的POSIX规范的一部分[,主要是为了向后兼容(例如,因为它们是test7th Edition UNIX 的一部分),但是POSIX将它们明确标记为“过时”。Bash(请参阅条件表达式)似乎抢先了经典和POSIX的含义,-a并-o带有自己的接受参数的替代运算符。一定要小心,您可以使用更现代的[[运算符,但是请注意,例如Bash和Korn Shell中的版本不必相同。for g in 1 2 3do    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    donedone在Mac OS X上使用Bash 3.2.57运行示例:g = 1; c = 123; trueg = 1; c = 456; falseg = 1; c = 789; falseg = 2; c = 123; falseg = 2; c = 456; trueg = 2; c = 789; falseg = 3; c = 123; falseg = 3; c = 456; falseg = 3; c = 789; false您不需要像使用引号一样引用变量[[,[因为它不是以相同的方式[是单独的命令。这不是一个经典的问题吗?我会这么想的。但是,还有另一种选择,即:if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]then echo abcelse echo efgfi的确,如果您阅读了该autoconf工具或相关软件包的“便携式外壳”指南,则建议使用“ ||”和“ &&” 这种符号。我想您甚至可以做到:if [ "$g" -eq 1 ] && [ "$c" = "123" ]then echo abcelif [ "$g" -eq 2 ] && [ "$c" = "456" ]then echo abcelse echo efgfi在动作像回声一样琐碎的情况下,这还不错。当要重复的动作块为多行时,重复会很痛苦,并且较早的版本之一是可取的-否则您需要将动作包装到在不同then块中调用的函数中。

潇湘沐

在Bash中:if [[ ( $g == 1 && $c == 123 ) || ( $g == 2 && $c == 456 ) ]]

守着星空守着你

使用/bin/bash以下方法将起作用:if [ "$option" = "Y" ] || [ "$option" = "y" ]; then    echo "Entered $option"fi
打开App,查看更多内容
随时随地看视频慕课网APP