Bashシェルの変数にデフォルト値を設定する
変数に値が未セットの場合にのみ任意の文字を代入したい
bashシェルのスクリプトの中で特定の変数に値がセットされていない場合はデフォルト値を代入するということがあります。そこで、変数に値が未セットの場合にのみ特定の値をデフォルト値として代入することができます。
bashには様々な変数の参照方法があるんですが、${変数名:=値}
と書くことで、値がセット済みの場合にはその値を返し、未セットの場合には任意の値を返すという動作をします。
1. インタラクティブなシェル上で変数を定義
例えば、$var
変数にhello
という値を代入しておき、上記の書き方で値を参照してみます。
1 2 3 4 |
|
$var
変数を空にしてgoog morning
という値を代入してみたいとしましょう。
1 2 3 4 5 6 7 |
|
${変数名:=値}
という書き方をした場合、返り値としてセットした(あるいはセットされている)値
を返します。その返り値をecho
でprintしています。
では、echo
させずに${変数名:=値}
だけを実行するとどうでしょう。
1 2 3 4 5 6 7 |
|
シェルは返り値をコマンドとして認識するのですが、goog morning
などというコマンドは存在しないのでメッセージが出力されます。しかし、$var
変数への値のセットは成功したようです。
echo
を使わずに、かつメッセージも出力させないためには以下のように、何もしないというコロン(:)
を使う方法があります。
1 2 3 4 5 6 |
|
2. シェルスクリプト内の変数値にtrue/falseを使用する場合の注意点
シェルスクリプトでset -e
を先頭に書いておくことで、スクリプト内のコマンドが失敗を返した場合にはスクリプトを終了させることが出来ます。おまじないのように書いていることがありますが、変数の値ににtrue/false
を使用している場合には注意が必要です。
true
やfalse
はbashシェルの組み込みコマンドとして存在し、その名の通り、true
は真を返し、false
は偽を返します。なので、${var:=false}
などと書いているとこの変数定義の行の実行結果は偽を返すことになります。
1 2 3 4 5 6 |
|
シェルスクリプトでset -e
としている場合にはそこでスクリプトが終了してしまい、期待通りに動かない可能性があります。ここでも何もしないというコロン(:)
を使用するという方法が有効です。