4

ksh シェルで、コマンドを実行した後に戻り値を確認したいので、次の 2 つのスタイルを記述しました。

if [ $? -ne 0 ] ; then
    echo "failed!"
    exit 1
else
    exit 0
fi


[ $? -ne 0 ] && echo "failed!" && exit 1

それらは同等ですか?そうでない場合、1行で書きたい場合はどうすればよいですか?

4

1 に答える 1

10

それらは近いですが、同じではありません。まず、 は何らかの理由で失敗した場合でもif実行します。連鎖式はそうではありません。また、連鎖バージョンには、.exit 1echoelse exit 0

同等のより良いものは次のようになります。

[ $? -ne 0 ] && { echo "failed!"; exit 1; } || exit 0

これはタグ付けkshされているので、数値式の構文がすっきりしているかもしれません:

(( $? )) && { echo "failed!"; exit 1; } || exit 0

ifただし、必要に応じて、1 行で書くこともできます。

if (( $? )); then echo "failed!"; exit 1; else exit 0; fi

設定するためにこの式の上で実行したコマンドが短い場合は、終了コード 0 が true であるため、逆句を$?使用して式として直接使用することをお勧めします。if

if grep -q "pattern" /some/filename; then exit 0; else echo "failed!"; exit 1; fi

この単純なケースでは問題ありませんが、一般的には避けたいと思うでしょうecho。代わりにprintf- を使用するか、ksh のみであることを気にしない場合は、 を使用できますprint。問題echoは、変数内の奇妙な文字列を処理するための移植可能な方法を提供しないことです。

$ x=-n
$ echo "$x"
$ 

との両方printfで次のことをprint行います。

$ printf '%s\n' "$x"
-n
$ print - "$x"
-n

繰り返しますが、ここでは問題ではありませんし、リテラル文字列を出力するだけの場合でも問題ありませんが、echo習慣を完全になくすように訓練する方が簡単であることがわかりました。

于 2012-06-29T03:53:25.360 に答える