如何在检查命令是否成功时将命令输出分配给变量?

时间:2017-12-02 15:04:22

标签: bash shell if-statement

我会尽力解释这个问题。如果需要,请不要犹豫要求澄清。

最终,我想要

  1. 时将命令的输出分配给变量
  2. 保持检查命令是否成功的可能性。
  3. 在以下代码中,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

    我该怎么办?谢谢! : - )

2 个答案:

答案 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

点数:

  1. var=$(foo ...):作业不会更改$?,因此$?仍然是foo的退出代码。
  2. export本身就是一个命令,因此export var=$(foo ...)的退出代码会覆盖foo的退出代码。
  3. 有些情况(语法错误;分配给只读变量; ...)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] $