シェル変数の便利な設定方法を紹介します。
例
# args.sh
#!/bin/bash
echo ${1:-now}
A=${1:?} # if $1 is not set, script ends here.
echo $A
A=${B:=abc}
echo $A
echo $B
A=${C:=def}
echo $A
echo $B
echo $C
実行結果
$ ./args.sh a
a
a
abc
abc
def
abc
def
$ ./args.sh
now
./args.sh: line 3: 1: parameter null or not set
説明
${B:=abc}
は、$B に値がセットされていたらそれを使い、
セットされていなかったら =
のあとに指定した値を $B に代入し使用する、という意味です。
${1:-now}
も似たような意味です。$1 に値がセットされていたらそれを使い、
セットされていなかったら -
のあとに指定した値を使用します。
ただし、指定した変数には代入されません。位置パラメタを扱うには好都合なわけです。
${1:?}
は、コメントの記述の通り、指定した変数の nullチェック をしてくれます。
しかも、シェルスクリプトの中に記載すると、値がセットされていなければ終了ステータス 1 で処理を終了してくれます。
また、?
の後に何か記載すれば、それがエラーメッセージとして利用されます。
#!/bin/bash
echo ${1:-now}
A=${1:?一つ目の引数を指定してください} # if $1 is not set, script ends here.
echo $A
実行結果
$ ./args.sh
now
./args.sh: line 3: 1: 一つ目の引数を指定してください
単純に引数が指定されているかどうかだけなら、これで書けてしまう、というわけです。
補足
以上、簡単な記述方法の紹介をしました。
書く側からすると確かに便利なのですが、後で読む人に対しては親切ではありません。
ちゃんとコメントを残すか、自分用にちょっとしたものを書くときなどに限定した方がいいかもしれませんね。
なお ${A:+ghi}
とすると、-
を使用した場合の逆になります。Aに値がセットされていたら、ghi を使用します。変数Aの値は変わりません。