1. Qiita
  2. 投稿
  3. Bash

`set -e` しているときにコマンドの戻り値を得る

  • 83
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

次の書き方だと ./xxx.sh が 0 以外のときにそこで終了してしまうので case の後が実行されることはありません。

set -e

./xxx.sh $1

case $? in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end

一時的に set +e して戻り値を変数に入れてから set -e に戻す方法が考えられますがイマイチです。

set -e

set +e
./xxx.sh $1
ret=$?
set -e

case $ret in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end

次のようにすると上手くいきます。

set -e

./xxx.sh $1 &&:

case $? in
  1) echo one ;;
  2) echo two ;;
  *) echo unk ;;
esac

echo end

解説

set -e&&|| でコマンドが繋げられた場合、リストの最後のコマンドが非 0 を返した場合だけ終了します。

./xxx.sh が 0 を返した場合、&& の後ろの : が実行されます。
: は何もせずに成功する組み込みコマンドなので、戻り値は 0 です。
よって $? は 0 です。

./xxx.sh が非 0 を返した場合、リストの最後ではないので set -e でも終了しません。
さらに && で繋がっているので : は実行されません。
よって $?./xxx.sh の戻り値そのままです。