More than 1 year has passed since last update.

背景

Qiitaではストック数が高いTipsについてRecommendation機能があるようで、そのときにシェルスクリプトを書くときはset -euしておくRecommendされて、こいつは使えそうだと思い自分用にメモした。

set -e, set -uの動作

それぞれの動作は以下。

set option 使い方 意味
-e set -e return codeが0以外のコマンド実行時に処理を終了する。
+e set +e -e オプションの取り消し
-u set -u 未定義変数を参照したときに処理を終了する。
+u set +u -u オプションの取り消し

使ってみた

set -e

まずはset -eなしの以下のスクリプトを用意。

normal.sh
#!/bin/bash

echo 'start'
grep 'no_line' sample.txt # 異常終了コマンド
echo 'end'

実行してみる。

./normal.sh
$ ./normal.sh
start
end
$ echo $?
0

一番最後のecho 'end'が正常に終了しているのでreturn codeは0になっている。

次にset -eを指定した以下のスクリプトを用意。

normal_-e.sh
#!/bin/bash

set -e
echo 'start'
grep 'no_line' sample.txt # 異常終了コマンド
echo 'end'

実行してみる。

./normal_-e.sh
$ ./normal_-e.sh
start
$ echo $?
1
$ grep 'no_line' sample.txt
$ echo $?
1
$

endが表示されずにreturn codeが1で終了しており、これは異常終了コマンドであるreturn codeであることがわかる。

set -u

まずはset -uなしの以下のスクリプトを用意。

normal.sh
#!/bin/bash

echo 'start'
echo ${not_defined} # 未定義変数
echo 'end'

実行してみる。

./normal.sh
$ ./normal.sh
start

end
$ echo $?
0
$

未定義変数なので改行だけ挿入され、return codeが0である。
次に以下のset -u付きのスクリプトを用意。

normal_-u.sh
#!/bin/bash

set -u
echo 'start'
echo ${not_defined} # 未定義変数
echo 'end'

実行。

./normal_-u.sh
$ ./normal_-u.sh
start
./normal_-u.sh: 行 5: not_defined: 未割り当ての変数です
$ echo $?
1
$

上記のメッセージが表示されて、endが表示されずreturn codeが1で終了することがわかる。

これで、未定義の変数のためにrm -rf ${nothing}/*で全削除されたり、rc=$?;if [[ ${rc} -ne 0 ]]; thenというようなコードを書かなくて良くなる気がする。

おしまい。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.