やりたいこと
- bashでデータをファイルから読み込んで複数の変数に格納する場合、一つでもデータがない場合は処理させないようにさせたい。
考え方
- 変数を配列にしてその数の整合性をチェックすればいい。
NGなコード
x=FLASE; y=TRUE; # 初期値
str=$( awk '{print $1, $2}' hoge.txt ); # 結果はstr="TRUE "だとします。
read x, y <<< $str
# チェック
echo $x # -> "TRUE"
echo $y # -> ""
# 片方のデータがない場合、yは””で上書きされて初期値が失われてしまいます。
より安全で簡単なコード
x=FLASE; y=TRUE; # 初期値
str=($( awk 'print $1, $3}' hoge.txt ))
[ ${#str[@]} -eq 2 ] && x=${str[0]} && y=${str[1]}
# チェック
echo $x; # -> FALSE
echo $y; # -> TRUE
# データが片方ない場合は実行されないので初期値のままです。
簡単な説明
-
str=($( ... ))
と$(...)
を()
で囲んで配列に入れます。 - これを
${#str[@]}
で数を勘定し、これを予定の個数にあれば代入式を実行させます。 - というわけで、複数のデータを取り出す場合、一つでもデータの欠損がある場合は処理させないようにできます。
結果にスペースのある場合
- 結果を""で囲ってください。
str=("a A" "b B");
[ ${#str[@]} -eq 2 ] && x=${str[0]} && y=${str[1]}
# チェック
echo $x; # -> a A
echo $y; # -> b B
# それぞれを""で囲えばうまく行きます。
簡単な仕掛けでより安全にできるのはいいですね。どなたかのお役に立てれば幸いです。