如何在 Bash 中的多行上格式化“if”语句(条件)?

如何在 Bash 中的多行上格式化“if”语句(条件)?

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

do_something() {
  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

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

正确的语法是什么?

答案1

使用反斜杠。

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

编辑

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

仅使用一个 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
}

答案2

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

#!/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

正确的语法是:

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"

答案4

我更喜欢:

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

相关内容