如何将函数的成功/失败状态分配给 Bash 中的变量?

如何将函数的成功/失败状态分配给 Bash 中的变量?

我知道一种方法是:

# run a command here, like [[ $A == *"ABC"* ]]
result=$?
if (( result == 0 ))
then
  result=true
else
  result=false
fi

然后我可以这样做:

if $result
then
...

有没有一行方法来编写第一块代码?我可以在 C 中做这样的事情:

bool result = funct_a() && funk_b()

答案1

cmd && result=true || result=false

答案2

通常,您可以将命令直接放在if语句中,而不是绕过$?and (( .. ))。特别是像这样的东西[[ .. ]]:它甚至看起来像一个条件结构。

if [[ $A == *"ABC"* ]]; then
     result=true
     dosomethinghere
     ...         

另外,请注意,如果您运行if $result ...,您实际上正在运行变量中包含的命令resulttrue并且可以作为命令运行,但是如果可以包含类似...false的内容,您就不会想要这样做resultrm

$?相反,您可以像上面那样保存 的值,result=$?然后在需要时使用if (( result == 0 ))或,而不是向 中添加另一个级别的分配。if [[ $result == 0 ]]result

答案3

你可以这样做:

cmd; f result

在这个小功能的帮助下:

f () { last="$?"; declare -n ref="$1"; [[ "$last" == 0 ]] && ref=true || ref=false;}

(您可以将此函数称为比f......更合适的东西。我不知道什么更合适。)无论如何,它必须在命令之后立即应用,并用分号与命令分隔,而不是与&&or链接||。它采用结果变量的名称,不带$.该函数对传递的名称进行引用,其余的就很明显了。

这是一个演示:

$ f () { last="$?"; declare -n ref="$1"; [[ "$last" == 0 ]] && ref=true || ref=false;}
$ true; f result; echo "$result"
true
$ false; f result; echo "$result"
false

您可能还需要一个更复杂的助手:

g () { declare -n ref="$1"; shift; "$@" && ref=true || ref=false; }

这个应该提供结果变量,后跟命令。其余的都是一样的。这是g行动中的:

$ g () { declare -n ref="$1"; shift; "$@" && ref=true || ref=false; }
$ g result ls -lt; echo "$result"
total 2488
drwxr-xr-x  6 tomas tomas    4096 Jan 22 11:41 Documents
drwxr-xr-x  2 tomas tomas    4096 Jan 22 11:26 Pictures
...
true
$ g result asdfasdf; echo "$result"
bash: asdfasdf: command not found
false

或者,如果您愿意,f也可以保留名称。g

相关内容