bashによるシェルスクリプトの小技(1)

今回から何度かに分けてシェルスクリプト(主にbash)の小技を紹介する予定です。まずは第一弾として、変数の特殊な参照方法を紹介。

変数の特殊参照方法

変数の状態に応じて振る舞いを変える特殊な参照方法。変数に値が設定されていない場合に一時的に値を与えて参照する、などの特殊な参照が可能。知っているとなかなか便利な機能ではあるが、これらをむやみに使用するとシェルスクリプトの可読性が低下し、思わぬバグを生む可能性があるので、あまり多用はしないほうがよさそう。

参照方法 参照結果
${VAR=aaa} 変数 VAR が未使用の場合に限り、変数VARへ文字列「aaa」を代入し文字列「aaa」を返す。変数VARがNULL値を含み既に使用されている場合は、変数 VAR への代入を行わず、変数 VAR の値を返す。
${VAR:=aaa} 変数 VAR が未使用もしくは NULL の場合に限り、変数 VAR へ文字列「aaa」を代入し文字列「aaa」を返す。 変数 VAR が NULL 値の場合を除き、既に使用されている場合は変数 VAR への代入を行わず、変数 VAR の値を返す。
${VAR-aaa} 変数 VAR が未使用の場合に限り、文字列「aaa」を返す。変数 VAR が NULL 値を含み既に使用されている場合は、変数 VAR の値を返す。また、変数 VAR が使用済み・未使用に関わらず、変数 VAR への代入は行われない。
${VAR:-aaa} 変数 VAR が未使用もしくは NULL 値の場合に限り、文字列「aaa」を返す。変数 VAR が NULL 値以外の値で既に使用されている場合は、変数 VAR の値を返す。また、変数 VAR が使用済み・未使用に関わらず、変数 VAR への代入は行われない。
${VAR+aaa} 変数 VAR が NULL 値も含み既に使用されている場合に限り、文字列「aaa」を返す。変数 VAR が未使用の場合は、NULL 値を返す。また、変数 VAR が使用済み・未使用に関わらず、変数 VAR への代入は行われない。
${VAR:+aaa} 変数 VAR が NULL 値以外で既に使用されている場合に限り、文字列「aaa」を返す。変数 VAR が NULL 値もしくは未使用の場合は、NULL 値を返す。また、変数 VAR が使用済み・未使用に関わらず、変数 VAR への代入は行われない。
  • NULL 値に関して
    • ここでの NULL 値とは、「VAR=""」や「VAR=」のように値が空(空文字)の状態を意味する。

以下は、特殊な参照方法の実行結果まとめ。変数VARの書き方と結果の対応表。

  変数VARが・・・、
未使用 NULL 設定済み
値の設定 返す値 値の設定 返す値 値の設定 返す値
${VAR=aaa} あり aaa なし "" なし $VAR
${VAR:=aaa} あり aaa あり aaa なし $VAR
${VAR-aaa} なし aaa なし "" なし $VAR
${VAR:-aaa} なし aaa なし aaa なし $VAR
${VAR+aaa} なし "" なし aaa なし aaa
${VAR:+aaa} なし "" なし "" なし aaa

用例(サンプル)

  • 例として、以下にサンプルの内容と実行結果を示す。
    • この例では「${VAR:=aaa}」のパターンを使い、第1引数が空であればVAR変数のデフォルト値として「aaa」を返すようにしている。


$ cat test01.sh
#!/bin/bash
VAR=$1
test "$VAR" = "" && VAR=${VAR:=aaa}
echo "VAR: $VAR"

    • 第1引数に値をセットした場合の実行結果


$ sh test01.sh HOGE
VAR: HOGE

    • 第1引数に値をセットしなかった場合の実行結果(デフォルト値として「aaa」がセットされたことがわかる)


$ sh test01.sh
VAR: aaa

bashによるシェルスクリプトの小技(2)に続く・・・。