Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

次の書き方だと ./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 の戻り値そのままです。

ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away