18

我想重新创建这样的东西

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

到目前为止,我确实做到了,但出现以下错误:

line 11: [.: command not found

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

我尝试了不同的方法,但似乎都没有奏效。我试过的一些

4

4 回答 4

26

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

if [[ foo || bar || baz ]] ; then
  ...
fi

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

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

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

[ foo -o bar -o baz ]

...这是以下内容的不同书写形式,同样被弃用:

test foo -o bar -o baz
于 2012-06-29T19:06:54.473 回答
6

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

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

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

例子

带整数的复合语句

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

带字符串的复合语句

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

[ 上述语句的等价物,使用 {}

[ "$a" -eq 2 ] || { [ "$b" -eq 2 ] && [ "$c" -eq 3 ]; }
[ "$x" == orange ] || { [ $y == mango ] && [ "$z" == pear ]; }

有关的

于 2019-04-04T20:17:17.750 回答
4

Charles 的回答是正确的,因为它向您展示了如何在语句内(和没有,就此而言)对命令执行逻辑操作if,但它看起来更像是您想在case这里使用:

case $char in
    \;|\\|\') echo found;;
    *) echo 'not found';;
esac
于 2012-06-29T19:09:39.990 回答
0

在 bash 中,要使用[ ]构造对条件进行分组,您必须使用括号将每个组括起来。每个左/右括号必须转义,并在前面/后面加一个空格。见下文:

if [ \( "$char" = "$;" \) -o \( "$char" = "$\\" \) -o \( "$char" = "$\" \) ]

因此,最好听从其他人的建议并使用 bash 的新[[ ]]结构。最后,据我了解,它==是一个关系运算符,旨在用于算术表达式。IE -

$((3==4))

Cameron Newham 和 Bill Rosenblatt,“学习 bash Shell”,1998 年 1 月

于 2021-10-29T11:06:12.680 回答