【问题标题】:Using logical OR in a Bash shell if statement在 Bash shell if 语句中使用逻辑 OR
【发布时间】:2018-03-07 10:02:54
【问题描述】:

我不明白为什么这个if 语句会给出错误提示:

使用太多参数

if [ $file == 'Metro[0-9]*' ] -o [ $file == 'Store[0-9]*' ]

     echo "$file"

我确实使用了括号的每一种组合,认为可能存在错误,但没有任何改变。有趣的是,如果我只使用其中一个条件并删除另一个条件,条件就会起作用。所以我认为使用-o 或括号有问题...

【问题讨论】:

  • 你没有错过thenfi 语句吗?
  • 你能详细说明你在这里想要实现的目标吗?

标签: linux bash shell ubuntu logical-operators


【解决方案1】:

没有shell操作符-o,你好像在找

if [[ $file == 'Metro'[0-9]* || $file == 'Store'[0-9]* ]]; then
   echo "$file"
fi

当然写得更简洁、更便携

case $file in 'Metro'[0-9]* | 'Store'[0-9]*) echo "$file";; esac

请注意引号中的多项更改:如果您希望通配符扩展,则不能在引号内,并且文件名通常应在双引号内(尽管在 [[case 之后不是必需的)。

还要注意对 [[ 的更改,它不是 POSIX sh 命令——上面的第一个替代方案特定于 Bash / Ksh / 其他“现代”扩展 shell。 POSIX [(又名test)没有简单的方法来检查文件是否匹配任意通配符表达式。有趣的是,Bash 也支持if [ condition1 -o condition2 ],但这也不是可移植的,因此在某种程度上是两个世界中最糟糕的。

【讨论】:

    【解决方案2】:
    • 您的if 条件缺失thenfi
    • -o 运算符不存在,但您可以使用|| 来表示 OR。
    • 由于您使用的是 Bash,因此您可以使用 =~ 运算符将字符串与正则表达式进行比较。

    所以你可以这样写你的条件:

    if [[ "$file" =~ (Metro|Store)[0-9]* ]] ; then
         echo "$file"
    fi
    

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多