シェル変数の引継ぎを確認する

bash で親プロセスから子プロセスへ適切に変数が引き継がれているか確認したい場合があります。一々if文で判定を行っていたのですが、ループを使用して行数を大幅に減らせることがわかりました。${!var} という表記がミソです。${var} に fuga という値が代入されると、 ${!var} は ${fuga} を評価することになります。すなわち [ -z ${!var} ] は ${fuga} に値が入っているか否かを判定していることになります。

#!/bin/bash
error_num=0
for var in fuga hoge
do
 if [ -z ${!var} ]
  then
   printf "[%s] 関数 %s の変数 ${var} に値がありません\n" \
    "`date +"%F %T"`" `basename $0`
   error_num=`expr ${error_num} + 1`
 fi
done

echo エラーは${error_num}回です    

f:id:S_E_Hyphen:20211103162705p:plain

当初、変数 fuga にも hoge にも値が入っていませんから、そのようにエラーメッセージが表示されます。次に export を使用してfugaに値を入れてやると、エラーメッセージからfugaに関する内容が消えました。

export を使わずに変数を作成しても子プロセスには引き継がれませんからhogeのエラーは消えません。変数 error_num にはエラーの回数が積算されていますから、これを利用して強制終了させたりすることも可能となります。