为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2020-02-04 15:14:08
我想代表多个条件,例如: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行显示的是....这种情况怎么了?我猜这是有问题的()。
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

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


if [ \( "$g" -eq 1 -a "$c" = "123" \) -o \( "$g" -eq 2 -a "$c" = "456" \) ]

then echo abc

else echo efg

fi

我已经$g用双引号将引用括起来;一般来说,这是一个好习惯。严格来说,并不需要括号,因为的优先级-a,并-o使得它纠正,甚至没有他们。


请注意,-aand -o运算符是testaka 的POSIX规范的一部分[,主要是为了向后兼容(例如,因为它们是test7th Edition UNIX 的一部分),但是POSIX将它们明确标记为“过时”。Bash(请参阅条件表达式)似乎抢先了经典和POSIX的含义,-a并-o带有自己的接受参数的替代运算符。


一定要小心,您可以使用更现代的[[运算符,但是请注意,例如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

您不需要像使用引号一样引用变量[[,[因为它不是以相同的方式[是单独的命令。


这不是一个经典的问题吗?


我会这么想的。但是,还有另一种选择,即:


if [ "$g" -eq 1 -a "$c" = "123" ] || [ "$g" -eq 2 -a "$c" = "456" ]

then echo abc

else echo efg

fi

的确,如果您阅读了该autoconf工具或相关软件包的“便携式外壳”指南,则建议使用“ ||”和“ &&” 这种符号。我想您甚至可以做到:


if [ "$g" -eq 1 ] && [ "$c" = "123" ]

then echo abc

elif [ "$g" -eq 2 ] && [ "$c" = "456" ]

then echo abc

else echo efg

fi

在动作像回声一样琐碎的情况下,这还不错。当要重复的动作块为多行时,重复会很痛苦,并且较早的版本之一是可取的-否则您需要将动作包装到在不同then块中调用的函数中。


查看完整回答
1 反对 回复 2020-02-04
?
潇湘沐

TA贡献1816条经验 获得超6个赞

在Bash中:


if [[ ( $g == 1 && $c == 123 ) || ( $g == 2 && $c == 456 ) ]]


查看完整回答
1 反对 回复 2020-02-04
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

使用/bin/bash以下方法将起作用:


if [ "$option" = "Y" ] || [ "$option" = "y" ]; then

    echo "Entered $option"

fi


查看完整回答
1 反对 回复 2020-02-04
  • 3 回答
  • 0 关注
  • 6130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信