複数の戻り値を処理するためにCaseステートメントを使用する方法

複数の戻り値を処理するためにCaseステートメントを使用する方法

次の試みを確認してください。

$ 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

おすすめ記事