ksh シェルで、コマンドを実行した後に戻り値を確認したいので、次の 2 つのスタイルを記述しました。
if [ $? -ne 0 ] ; then
echo "failed!"
exit 1
else
exit 0
fi
[ $? -ne 0 ] && echo "failed!" && exit 1
それらは同等ですか?そうでない場合、1行で書きたい場合はどうすればよいですか?
それらは近いですが、同じではありません。まず、 は何らかの理由で失敗した場合でもif
実行します。連鎖式はそうではありません。また、連鎖バージョンには、.exit 1
echo
else 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
習慣を完全になくすように訓練する方が簡単であることがわかりました。