在Bash中使用多个表达式if语句

dav*_*vid 13 syntax bash if-statement

我想重新创建这样的东西

if ( arg1 || arg2 || arg 3) {}
Run Code Online (Sandbox Code Playgroud)

我到目前为止,但我收到以下错误

line 11: [.: command not found

if [ $char == $';' -o $char == $'\\' -o $char == $'\'' ]
then ...
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的方法,但似乎没有人尝试过我试过的一些方法

Cha*_*ffy 19

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

if [[ foo || bar || baz ]] ; then
  ...
fi
Run Code Online (Sandbox Code Playgroud)

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

[ foo ] || [ bar ] || [ baz ]
Run Code Online (Sandbox Code Playgroud)

...或者使用特定于test命令的运算符(尽管现代版本的POSIX规范将此XSI扩展描述为已弃用 - 请参阅"应用程序使用"部分):

[ foo -o bar -o baz ]
Run Code Online (Sandbox Code Playgroud)

...这是以下不同的书面形式,同样弃用:

test foo -o bar -o baz
Run Code Online (Sandbox Code Playgroud)


cod*_*ter 5

Bash 的[[ ]](( ))[ ].

  • [[ ]]用于字符串,(( ))用于整数逻辑和算术
  • &&and||运算符可以在[[ ]]and内部使用(( ))()也可以用于分组
  • 无需在内部引用变量扩展[[ ]](( ))- Bash在这些上下文中不进行分或通配
  • 在里面(( )),不需要$后面的变量名来扩展它们
  • [[ ]]并且(( ))可以跨越多行,而无需行延续\

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

例子

带整数的复合语句

a=1 b=2 c=3
((a == 2 || (b == 2 && c == 3))) && echo yes                   # yields yes
Run Code Online (Sandbox Code Playgroud)

带字符串的复合语句

x=apple y=mango z=pear
[[ $x == orange || ($y == mango && $z == pear) ]] && echo yes  # yields yes
Run Code Online (Sandbox Code Playgroud)

[ 上述语句的等效项,使用 {}

[ "$a" -eq 2 ] || { [ "$b" -eq 2 ] && [ "$c" -eq 3 ]; }
[ "$x" == orange ] || { [ $y == mango ] && [ "$z" == pear ]; }
Run Code Online (Sandbox Code Playgroud)

有关的