背景
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なしの以下のスクリプトを用意。
# !/bin/bash
echo 'start'
grep 'no_line' sample.txt # 異常終了コマンド
echo 'end'
実行してみる。
$ ./normal.sh
start
end
$ echo $?
0
一番最後のecho 'end'
が正常に終了しているのでreturn code
は0になっている。
次にset -e
を指定した以下のスクリプトを用意。
# !/bin/bash
set -e
echo 'start'
grep 'no_line' sample.txt # 異常終了コマンド
echo 'end'
実行してみる。
$ ./normal_-e.sh
start
$ echo $?
1
$ grep 'no_line' sample.txt
$ echo $?
1
$
end
が表示されずにreturn code
が1で終了しており、これは異常終了コマンドであるreturn code
であることがわかる。
set -u
まずはset -uなしの以下のスクリプトを用意。
# !/bin/bash
echo 'start'
echo ${not_defined} # 未定義変数
echo 'end'
実行してみる。
$ ./normal.sh
start
end
$ echo $?
0
$
未定義変数なので改行だけ挿入され、return code
が0である。
次に以下のset -u
付きのスクリプトを用意。
# !/bin/bash
set -u
echo 'start'
echo ${not_defined} # 未定義変数
echo 'end'
実行。
$ ./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
というようなコードを書かなくて良くなる気がする。
おしまい。