如果条件在bash shell中多行


19

我有一个bash shell函数,该函数接受一个参数,并在需要时对其执行一些操作。

do_somthing() {
  if [need to do something on $1]
  then
    do it
    return 0
  else
    return 1
  fi
}

我想用几个参数调用此方法,并检查是否至少有一个成功。

我尝试了类似的东西:

if [ do_something "arg1" ||
     do_something "arg2" ||
     do_something "arg3" ]
then
  echo "OK"
else
  echo "NOT OK"
fi

正确的语法是什么? 另外,还要
编辑
-我想确保即使第一个条件为true,所有其他条件仍将被评估。

谢谢,


我已经更新了答案。
tectux

谢谢,能否请您举例?
伊泰,

1
我在答案中添加了一个代码示例。
tectux

Answers:


7

首先运行命令,然后检查其中至少一个是否成功。

#!/bin/bash

success=0
do_something arg1 && success=1
do_something arg2 && success=1
do_something arg3 && success=1

if ((success)); then
    printf 'Success! At least one of the three commands succeeded\n'
fi

3
这很令人困惑,如果您能提供一些关于条件语句如何在bash ...中工作的解释,我会很高兴,do_something成功后返回0,但随后我们将成功更新为1 ...,if ((success))得出的结果与有所不同if success。我很困惑:)
Itay

2
@Itay ((...))是一个算术命令。如果内部结果为非零,则返回true(0)。如果内部结果为0,则返回false(1)。“成功”被视为期望包含数字的变量。参见mywiki.wooledge.org/ArithmeticExpression
geirha,2013年

谢谢,我想让我困惑的部分是0是正确的,而1是错误的通常是相反的:)
Itay

2
@Itay是的,起初可能会令人困惑。Bash与通用语言的不同之处在于它是“基于命令的”。它不调用函数,不具有类和方法,它运行命令并测试命令的退出状态。与b之类的语言(如C,python,java,perl等)相比,用bash运行命令要容易得多。命令退出时以0表示成功,而退出则以1-255表示各种类型的失败。(命令通常只能以一种方式成功,但由于各种不同的原因而失败)
盖尔哈(Geirha

2
该方案的优点是你可以注释掉你不想暂时停用他们的线
乔赛亚·约德

31

使用反斜杠。

if [ $(do_something "arg1") ] || \
   [ $(do_something "arg2") ] || \
   [ $(do_something "arg3") ]
then
  echo "OK"
else
  echo "NOT OK"
fi

编辑

另外-我想确保即使第一个条件为true,所有其他条件仍将被评估。

只有一个if语句不可能做到这一点。相反,您可以使用for循环遍历参数并分别对其求值。就像是:

do_something() {
  for x in "$@"
  do
    if [need to do something on $x]
    then
      do it
    else
      echo "no action required on $x"
    fi
  done
}

谢谢,尝试过-我收到一个错误[: do_something: unary operator expected
Itay,

您是否将每个评估放在自己的括号之间?所以[ expr1 ] || [ expr2 ]代替[ expr1 || expr2 ]
tectux

是的,我做到了:(...
Itay

我的猜测是这do_something "arg1"被解释为两个参数,而表达式应该是一元的。有什么方法do_something "arg1"可以将其作为一个参数进行评估?
伊泰,

1
你是对的。这工作太:if [ $(do_something "arg1") ]
tectux

5

正确的语法是:

if  do_something "arg1" || \
    do_something "arg2" || \
    do_something "arg3"
then
  echo "OK"
else
  echo "NOT OK"
fi

\ 用于告诉shell命令在下一行继续。

编辑:我认为这应该做你想要的:

#!/bin/bash

do_something() {
  if [need to do something on $1]
  then
    do it
    echo "OK"
  else
    echo "NOT OK"
  fi
}

do_something "arg1"
do_something "arg2"
do_something "arg3"

谢谢,结果有一个错误:[: too many arguments
Itay

@Itay答案已更新。
埃里克·卡瓦略

更新问题-这还不是最终答案:(
伊泰

-1

我更喜欢:

if {
    do_something "arg1" ||
    do_something "arg2" ||
    do_something "arg3"
}; then
    echo "OK"
else
    echo "NOT OK"
fi

您的脚本根本不起作用:在第一个测试参数之后,它将生成一个\n字符,因此您的if语句将生成一些错误,并且do_something不是命令名称,所以会有更多错误
damadam

对我来说,它可以在zsh和bash中工作,IF do_something是一个功能。do_something必须是功能或命令,还应该是什么?此外,\n除了回显结果之后,我看不到它将在哪里生成字符,这是可以预期的……
Toxiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.