ヌルコマンドでシェルスクリプトの変数が空の場合に特定の値を代入させる

シェルスクリプトを書いていると、特定の変数の値が空(NULL)の時はデフォルト値を代入する処理を行う必要が出てくる事がある。
そんなときは、ヌルコマンドで変数が空の時はデフォルト値を代入するように記述すると良いだろう。

変数の値が空の時にデフォルト値を代入する場合は、以下のように記述する。

: ${変数:=デフォルト値}

以下の例では、引数を代入する変数『TEST_VAR』に値がない場合、デフォルト値として『DEFAULT_123』という値を代入する

#!/bin/sh
TEST_VAR=$1
: ${TEST_VAR:='DEFAULT_123'}

echo $TEST_VAR

[root@test-centos7 ~]# cat /work/TEST1.sh
#!/bin/sh
TEST_VAR=$1
: ${TEST_VAR:='DEFAULT_123'}

echo $TEST_VAR
[root@test-centos7 ~]# sh /work/TEST1.sh 123
123
[root@test-centos7 ~]# sh /work/TEST1.sh
DEFAULT_123

その他、ヌルコマンドでは以下のような使い方が出来るようだ。

●一時的な代入(変数に対し値の代入までは行わない)

変数が空(NULL)は一時的な代入を行い、その後の変数にまで影響しない場合は、「${変数:-代入値}」と記述する。
例として、以下のようなスクリプトを実行する。

#!/bin/sh
TEST_VAR=$1

echo "#変数が空の時"
echo ${TEST_VAR:-'DEFAULT_123'}
echo ""

echo "#再度呼び出す"
echo $TEST_VAR
echo ""

[root@test-centos7 ~]# cat /work/TEST2.sh
#!/bin/sh
TEST_VAR=$1

echo "#変数が空の時"
echo ${TEST_VAR:-'DEFAULT_123'}
echo ""

echo "#再度呼び出す"
echo $TEST_VAR
echo ""
[root@test-centos7 ~]#
[root@test-centos7 ~]# sh /work/TEST2.sh
#変数が空の時
DEFAULT_123

#再度呼び出す

[root@test-centos7 ~]#
[root@test-centos7 ~]# sh /work/TEST2.sh 1
#変数が空の時
1

#再度呼び出す
1

変数が空(NULL)の場合はNULLを、値が入っている場合は別の値を返す

変数が空(NULL)の場合にはそのままNULLを、値が代入されている場合のみ別の値を代入することもできる。
その場合は、「${変数:+代入値}」と記述すればよい。なお、この時変数に値は代入されないので注意。

以下、例となるスクリプトとその実行結果を記述しておく。

#!/bin/sh
TEST_VAR=$1

echo "#変数が空ではない時"
echo ${TEST_VAR:+'DEFAULT_123'}
echo ""

echo "#再度呼び出す"
echo $TEST_VAR
echo ""

[root@test-centos7 ~]# cat /work/TEST3.sh
#!/bin/sh
TEST_VAR=$1

echo "#変数が空ではない時"
echo ${TEST_VAR:+'DEFAULT_123'}
echo ""

echo "#再度呼び出す"
echo $TEST_VAR
echo ""
[root@test-centos7 ~]#
[root@test-centos7 ~]# sh /work/TEST3.sh 123
#変数が空ではない時
DEFAULT_123

#再度呼び出す
123

[root@test-centos7 ~]#
[root@test-centos7 ~]# sh /work/TEST3.sh
#変数が空ではない時

#再度呼び出す

変数が空(NULL)の場合はエラー終了する

変数が空の場合、その箇所でスクリプトをエラー終了させることも出来る。
その場合は、「${変数:?エラーメッセージ}」というように記述する。

以下、スクリプト例。

#!/bin/sh
TEST_VAR=$1
: ${TEST_VAR:?"変数がNULLです"}

echo $TEST_VAR

[root@test-centos7 ~]# cat /work/TEST4.sh
#!/bin/sh
TEST_VAR=$1
: ${TEST_VAR:?"変数がNULLです"}

echo $TEST_VAR
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 変数がNULLの場合
[root@test-centos7 ~]# sh /work/TEST4.sh
/work/TEST4.sh: 行 3: TEST_VAR: 変数がNULLです
[root@test-centos7 ~]#
[root@test-centos7 ~]# # 変数がNULLではない場合
[root@test-centos7 ~]# sh /work/TEST4.sh 12345
12345

うまく使いこなせれば、スクリプトの記述量も少なくできそうだ。