在 bash 脚本中,在“if”语句中使用条件“or”

在 bash 脚本中,在“if”语句中使用条件“or”

这个问题是我的问题的续集先前的问题。该网站上的用户好心地帮助我确定如何编写for迭代字符串值的 bash 循环。例如,假设循环控制变量fname对 strings 进行迭代"a.txt" "b.txt" "c.txt"。我想echo“是的!”当fname有值"a.txt""c.txt",并且echo“不!”否则。我尝试过以下 bash shell 脚本:

#!/bin/bash

for fname in "a.txt" "b.txt" "c.txt"
do
  echo $fname
  if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
    echo "yes!"
  else
    echo "no!"
  fi
done

我得到输出:

a.txt

不!

b.txt

不!

c.txt

是的!

为什么该语句在具有值if时显然会产生 true ?难道是我用错了?fname"a.txt"|

答案1

如果你想说OR使用双管( ||)。

if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]

(最初使用的 OP 代码|只是将左侧的输出通过管道传输到右侧,与任何普通管道的工作方式相同。)


经过多年的评论和误解,请允许我澄清一下。

来做OR你用的||

您是否使用[or [[or testor ((all 取决于您具体情况的需要。说在所有情况下都首选其中之一是错误的。有时[是对的,有时[[是错的。但这不是问题所在。 OP问为什么|不起作用。答案是因为它应该是||相反的。

答案2

接受的答案很好,但由于您使用的是 bash,我将添加 bash 解决方案:

if [[ "$fname" == "a.txt" || "$fname" == "c.txt" ]]; then

这在 bash 参考手册中有记录3.2.4.2 条件构造

表达式1 && 表达式2

如果表达式 1 和表达式 2 都为真,则为真。

表达式1 ||表达式2

如果表达式 1 或表达式 2 为真,则为真。

&& 和 ||如果表达式 1 的值足以确定整个条件表达式的返回值,则运算符不会计算表达式 2。

答案3

您还可以像这样使用 OR 条件

if test "$fname" = "a.txt" || test "$fname" = "c.txt"

答案4

你可以像这样使用或调节

 if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]

相关内容