我会尽力解释这个问题。如果需要,请不要犹豫要求澄清。
最终,我想要
在以下代码中,ls
仅是一个示例。我要使用的命令是不同的。
对于第一部分,通常,我会做这样的事情:
{
ls nonexistingfolder
} && {
echo "fine"
} || {
echo "error"
}
但是,当我使用export
将输出保存到变量时,上面的代码不起作用:
{
export MESSAGE=$(ls nonexistingfolder)
} && {
echo "fine"
} || {
echo "error"
}
以上代码将始终打印fine
。
我尝试使用if
语句:
export MESSAGE=$(ls notexistingfolder)
if [ -z "$MESSAGE" ] ; then echo "error" ; else echo "fine" ; fi
但是,如果命令在没有输出的情况下成功(例如,如果ls
列出一个空文件夹),则上面的代码将无法工作:
export MESSAGE=$(ls emptyfolder)
if [ -z "$MESSAGE" ] ; then echo "error" ; else echo "fine" ; fi
以上代码错误地打印error
。
所以我考虑定义一个"错误值" $MESSAGE
:
export MESSAGE=$(ls notexistingfolder || echo "error")
if [ "$MESSAGE" = "error" ] ; then echo "error" ; else echo "fine" ; fi
上面的代码按原样打印error
。
export MESSAGE=$(ls emptyfolder || echo "error")
if [ "$MESSAGE" = "error" ] ; then echo "error" ; else echo "fine" ; fi
上面的代码按原样打印fine
。
但是,命令成功的可能性很小,并返回一个与我的"错误值匹配的字符串"确切地说(例如,如果ls
列出包含名为error
的文件夹的文件夹):
export MESSAGE=$(ls folderwitherrorfolder || echo "error")
if [ "$MESSAGE" = "error" ] ; then echo "error" ; else echo "fine" ; fi
以上代码会错误地打印error
。
我该怎么办?谢谢! : - )
答案 0 :(得分:3)
export
通常是成功的,您正在评估该命令的状态。只是做:
MESSAGE=$(ls nonexistingfolder) && echo "fine" || echo "error"
export MESSAGE
请注意回声错误'可能是多余的,因为ls会产生一个像样的错误信息。 ' echo fine'也是多余的,并且违反了典型的unix哲学,以便悄然成功并且大声失败,但是YMMV。
答案 1 :(得分:3)
你可以
MESSAGE=$(ls ...)
if [[ $? -eq 0 ]]; then
success
else
failure
fi
export MESSAGE
点数:
var=$(foo ...)
:作业不会更改$?
,因此$?
仍然是foo的退出代码。export
本身就是一个命令,因此export var=$(foo ...)
的退出代码会覆盖foo的退出代码。有些情况(语法错误;分配给只读变量; ...)var=value
可能会发生变化$?
而export
可能会失败。例子:
[STEP 101] $ true
[STEP 102] $
[STEP 103] $ var=${:}
bash: ${:}: bad substitution
[STEP 104] $ echo $?
1
[STEP 105] $ export var=${:}
bash: var=${:}: bad substitution
[STEP 106] $ echo $?
1
[STEP 107] $