1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

シェルスクリプトを使う際、文字列が空の時にエラーで返すようにしたい。

Last updated at Posted at 2021-12-30

例えば、rm -rf ${STR}/とスクリプトを書いた時に${STR}が空だったら大惨事世界大戦になるのでそれを防ぎたい。

現状確認

以下のようにしていると、${STR}が空の時でもエラーとならない

test.sh
# !/bin/bash                                                                                                                                                                                                 

STR="test"
unset STR

echo ${STR}/
$ bash test.sh

変数展開

以下の${STR:?}/のようにシェルスクリプトの変数展開を用いると、${STR}が空の場合にエラーを返す

【シェル芸人への道】Bashの変数展開と真摯に向き合う

test.sh
# !/bin/bash                                                                                                                                                                                                 

STR="test"
unset STR

echo ${STR:?}/
$ bash test.sh
test.sh: line 6: STR: parameter null or not set

シェルの設定を変更

変数が多い時、エラー処理として全ての変数に変数展開を用いるのは大変なので、シェルの設定を変更したい。
setコマンドで、設定していない変数があったらエラーとする。
set -uをスクリプトのはじめに付ければ良いだけでとてもシンプル。

【 set 】コマンド――シェルの設定を確認、変更する

test.sh
# !/bin/bash                                                                                                                                                                                                 

set -u
# set -euo pipefail 指定でよく使われる
#   -e errexit: パイプやサブシェルで実行したコマンドが1つでもエラーになったら直ちにシェルを終了する
#   -u nounset: パラメーター展開中に、設定していない変数があったらエラーとする(特殊パラメーターである「@」と「*」は除く)
#   pipefail パイプラインの返り値を、最後のエラー終了値(0以外で終了した際の値、全ての実行が成功した場合は0)にする

STR="test"
unset STR

echo ${STR}/
$ bash test.sh
test.sh: line 6: STR: unbound variable

set -euo pipefail 指定でよく使われる。当分はこれを使うことにします。
(新規作成の場合はこれで良さそうだが、スクリプト保守時はset -uを加えた際の影響範囲が大きいかもしれないので、変数展開と使い分ける。)

参考

【シェル芸人への道】Bashの変数展開と真摯に向き合う
シェルスクリプトマナー
【 set 】コマンド――シェルの設定を確認、変更する

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?