set
で-u
オプションを指定しておくと、未指定のまま変数を使うのを避けられるので便利です。
ただ、以下のように明示的にエラーメッセージを出したい場合もあります。
test.sh
#!/bin/bash
set -u
if [[ -z "$1" ]]; then
echo "no arg" >&2
echo "Usage: ..."
exit 1
fi
# 省略...
しかし、-u
が適用されるため自前でのチェックができません。
bash-3.2$ ./test.sh
./test.sh: line 4: $1: unbound variable
次のように一時的に無効にすれば対応できますが、コードの状態が増えるし、戻し忘れのリスクもあります。
#!/bin/bash
set -u
set +u # 一時的にuオプションを無効にする
if [[ -z "$1" ]]; then
# 省略...
fi
set -u # 戻す
では、どうするか?
デフォルト値を利用することで、-u
オプションのチェックを回避することができます。
Man page of BASH
${parameter:-word}
デフォルトの値を使います。 parameter が設定されていないか空文字列であれば、 word を展開したものに置換されます。そうでなければ、 parameter の値に置換されます。
word
を指定しなければデフォルトに空文字が入るため、自前で空文字チェックができます。
#!/bin/bash
set -u
if [[ -z "${1:-}" ]]; then
# 省略...
fi
結果
bash-3.2$ ./test.sh
no arg
Usage: ...