LoginSignup
21
21

More than 5 years have passed since last update.

ShellScriptでset -euを使ってみた。

Last updated at Posted at 2014-08-23

背景

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というようなコードを書かなくて良くなる気がする。

おしまい。

21
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
21