我知道一种方法是:
# 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 ...
,您实际上正在运行变量中包含的命令result
。true
并且可以作为命令运行,但是如果可以包含类似...false
的内容,您就不会想要这样做result
rm
$?
相反,您可以像上面那样保存 的值,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