0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

bashで複数のデータを一度に変数格納する時に数を確認すればより安全にできるよ。短いコードで。

Posted at

やりたいこと

  • 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
# それぞれを""で囲えばうまく行きます。

簡単な仕掛けでより安全にできるのはいいですね。どなたかのお役に立てれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?