【问题标题】:Compound 'if' statements with multiple expressions in Bash在 Bash 中具有多个表达式的复合 if 语句
【发布时间】:2012-07-01 07:50:10
【问题描述】:

我想重新创建这样的东西

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

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

line 11: [.: command not found

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

我尝试了不同的方法,但似乎都不起作用some of the ones I tried

【问题讨论】:

  • 可能不需要使用$''
  • [ ] 内部使用== 实际上不是有效的POSIX sh,即使bash 允许它。仅使用单个 = 进行字符串比较测试。

标签: bash if-statement syntax


【解决方案1】:

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

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

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

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

...或使用特定于test 命令的运算符 (though modern versions of the POSIX specification describe this XSI extension as deprecated -- see the APPLICATION USAGE section):

[ foo -o bar -o baz ]

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

test foo -o bar -o baz

【讨论】:

  • 我会发誓我以前试过这个但没有结果..可能做了一些不同的事情,谢谢!
【解决方案2】:

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

case $char in
    \;|\\|\') echo found;;
    *) echo 'not found';;
esac

【讨论】:

  • 好电话 - 诚然,我对字面问题的看法与意图相反。
【解决方案3】:

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

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

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

示例

整数复合语句

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 ]; }

相关

【讨论】:

    【解决方案4】:

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

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

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

    $((3==4))
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2019-12-11
      • 2011-01-28
      • 1970-01-01
      • 2014-11-22
      • 2013-09-13
      相关资源
      最近更新 更多