86

test コマンドを使用して$?(最後に実行されたコマンドの戻りコード) がゼロでないかどうかを確認するスクリプトがあります。コードは次のとおりです。

$?最後に実行されたコマンドの終了ステータスです。

if (test $? -ne 0)
then
//statements//
fi

ただし、この検証方法は get syntax error として文字列に対しては機能しません。これに代わる適切な方法を提案してください。

4

10 に答える 10

92

以下に示すように、最初に変数に入れてからテストしてみてください

ret=$?
if [ $ret -ne 0 ]; then
        echo "In If"
else
        echo "In Else"
fi

これは役立つはずです。


編集:上記が期待どおりに機能しない場合は $?、適切な場所で使用していない可能性があります。戻りステータスをキャッチする必要があるコマンドの直後の行でなければなりません。ターゲットとその戻りステータスをキャッチする間に他の単一のコマンドがあったとしても、期待しているものではなく、この中間コマンドの returns_status を取得することになります。

于 2013-03-18T07:02:27.283 に答える
3

どのように文字列を取得したかはわかりませんが、次の$?ことができます。

if [[ "x$?" == "x0" ]]; then
   echo good
fi
于 2013-03-18T07:03:33.650 に答える
3

これは、同様の問題に対して思いついた解決策です

exit_status () {
if [ $? = 0 ]
then
    true
else
    false
fi
}

利用方法:

do-command exit_status && echo "worked" || echo "didnt work"
于 2014-05-08T10:13:46.237 に答える
1
<run your last command on this line>
a=${?}
if [ ${a} -ne 0 ]; then echo "do something"; fi

echo "do something"コマンドの代わりに、使用したいコマンドを使用してください

于 2013-03-18T10:29:07.170 に答える
1
if [ $var1 != $var2 ] 
then 
echo "$var1"
else 
echo "$var2"
fi
于 2015-07-22T07:37:07.300 に答える
0

スクリプトの開始時に set -o pipefail を配置して、失敗を返す

あなたがそうすれば、テストは失敗しますが、ティーは失敗しません。デフォルトでは $? 最後のコマンドを成功させるだけです。この場合は「tee」コマンドです

test | tee /tmp/dump
[ $? -ne 0 ] && echo "failed"
于 2016-12-24T12:41:09.147 に答える
0
function assert_exit_code {
    rc=$?; if [[ $rc != 0 ]]; then echo "$1" 1>&2; fi
}

...

execute.sh

assert_exit_code "execute.sh has failed"
于 2015-10-15T20:10:19.083 に答える