次の試みを確認してください。
$ case `true` in 0) echo success ;; *) echo fail ;; esac
fail
$ if `true` ; then
> echo "success"
> else
> echo "fail"
> fi
success
これでケースの説明が失敗するのはなぜですか?私がなぜその言葉を使用しないのか疑問に思うかもしれませんif
。説明します。私のコマンドが複雑な場合は、実行したい他の戻りコードが返されることがあります。コマンドを何度も実行したくありませんが、これはできません。
my_command
res = $?
case $? in
...
esac
これはset -e
、スクリプト内で使用しているため、my_command
失敗が返されるとスクリプトが中断されるためです。
しかし、解決策があります...
set +e
my_command
res=$?
set -e
case $? in
...
esac
しかし、見苦しいので、元の質問に戻ります...なぜそのcase my_command in ... esac
バージョンのみを使用できますか?
ベストアンサー1
使用できません
case $(somecommand) in ...
somecommand
コマンド置換は終了状態ではなくコマンドの出力に拡張されるため、終了状態をテストします。
標準出力では出力が生成されないため、使用すると$(true)
機能しません。true
あなたはできます
{ somecommand; err="$?"; } || true
case $err in
0) echo success ;;
*) echo fail
esac
errexit
これにより、()で実行されているスクリプトは-e
終了しません。
マニュアルからbash
(説明からset -e
):
失敗したコマンドが while キーワードまたは Until キーワードの直後のコマンド・リストの一部であるか、if または elif 予約語の後のテストの一部である場合、シェルは終了しません。最後の&&または||次のコマンドを除いて、&&または||の一部として実行されるすべてのコマンドをリストします。、最後のコマンドを除くパイプライン内のすべてのコマンド、または!に反転したコマンドの戻り値
この場合、成功または失敗の可能性のみがある場合は、実行が簡単になります。
if somecommand; then
echo success
else
echo fail
fi