シェルスクリプトを書くときに、set -eをつけることで、スクリプトの中で実行されたコマンドのリターンコードが0以外の場合はそこで終了させることができる。
なので、基本的にそこそこ長い処理を書くときには、意図せぬ処理を実行させなくしたり、エラーハンドリングを適切にやりたいときにはつけるのが定跡だと思っています。
grepコマンドや参照コマンドの実行結果でオブジェクトのあるなしを判定するときとかにはコマンドのリターンコードでエラーハンドリングするのがシンプルだけれど、そのコマンド実行時点でシェルスクリプトが止まってしまうことになる。
これを避ける方法を書きます。
まず、set -eをつけずに、コマンドのリターンコードでエラーハンドリングする場合
1 2 3 4 5 6 7 8 |
#!/bin/bash grep aiueo tmp.txt if [ $? -gt 0 ]; then echo no else echo ok fi |
-eオプションを付けても、強制終了しない書き方。
grep結果が偽であっても、echoコマンドまでちゃんと実行される。
ifの中でコマンド実行することで、-eの範囲の外になるみたい。
1 2 3 4 5 6 7 8 9 |
#!/bin/bash set -e if ! grep aiueo tmp.txt ; then echo no else echo ok fi |
1 2 3 |
sh tmp.sh grep: tmp.txt: そのようなファイルやディレクトリはありません no |
別の方法として、一時的に+eとすることで回避することもできる。
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash set -e set +e grep aiueo tmp.txt if [ $? -gt 0 ]; then echo no else echo ok fi set -e |
参考