复合在Bash中具有多个表达式的if语句

Compound if statements with multiple expressions in Bash

我想再做点像这样的东西

1
if ( arg1 || arg2 || arg 3) {}

我确实做到了,但我得到了以下错误

1
2
3
4
line 11: [.: command not found

if [ $char == $';' -o $char == $'\' -o $char == $'\'' ]
then ...

我试过不同的方法,但似乎没有一个能奏效,我试过的一些方法。


对于bash,您可以使用[[ ]]形式,而不是[ ],它允许&&||内部:

1
2
3
if [[ foo || bar || baz ]] ; then
  ...
fi

否则,您可以在外部使用常用的布尔逻辑运算符:

1
[ foo ] || [ bar ] || [ baz ]

…或者使用特定于test命令的操作符(a href="http://pubs.opengroup.org/stage7tc1/utilities/test.html"rel="noreferrer">posix规范的现代版本将此xsi扩展描述为已弃用--请参阅应用程序使用部分/aa):

1
[ foo -o bar -o baz ]

…这是以下内容的另一种书面形式,同样不赞成:

1
test foo -o bar -o baz


Charles的回答是正确的,因为它向您展示了如何在if语句内(也不包括该语句在内)对命令执行逻辑操作,但看起来您更希望在这里使用case

1
2
3
4
case $char in
    \;|\\|\') echo found;;
    *) echo 'not found';;
esac


巴什的[[ ]](( ))[ ]更强大、更灵活。

  • [[ ]]表示字符串,(( ))表示整数逻辑。
  • &&||运算符可在[[ ]](( ))内使用,()可用于分组。
  • 不需要引用[[ ]](( ))中的变量扩展,bash在这些上下文中不进行分词或全局化。
  • (( ))内部,不需要在变量名后面有$来扩展变量名。
  • [[ ]](( ))可以跨多条线路,不需要用\进行线路延续。

使用这些,我们可以编写干净、可读和更可靠的代码。

实例带整数的复合语句

1
2
a=1 b=2 c=3
((a == 2 || (b == 2 && c == 3))) && echo yes                        # yields yes

带字符串的复合语句

1
2
x=apple y=mango z=pear
[[ $x =="orange" || ($y =="mango" && $z =="pear") ]] && echo yes # yields yes

相关的

  • 在bash中,双方括号[]比单方括号[]更可取吗?
  • 如何使用双括号或单括号、圆括号、大括号
  • 比较整数:Unix和Linux上的算术表达式或条件表达式
  • 测试bash中的非零长度字符串:[-n"$var"]或["$var"]
  • 条件表达式-bash手册