j3iiifn’s blog

ネットワーク、インフラ、プログラミングについての備忘録

readコマンドで1つの文字列から複数の変数に代入するとき

前提

やりたいこと

変数 var_input に文字列が入っている。その文字列には、複数の値がカンマ区切りで記録されている。

input_var="aaa,bbb,ccc,ddd"

変数 input_var を読み込み、カンマ区切りで第1フィールドを変数 var_a に、第2フィールドを変数 var_b に代入したい。

var_a="aaa"
var_b="bbb"

解法

IFS=, read var_a var_b _ <<< "${input_var}"

出力

$ IFS=, read var_a var_b _ <<< "${input_var}"
$ echo ${var_a}
aaa
$ echo ${var_b}
bbb

IFS=, で区切り文字をカンマ , に指定している。

<<< word はヒアストリング (Here Strings) というbash独自の記法である。詳しくは man bash を参照のこと。

よくある誤答

echo "${input_var}" | IFS=, read var_a var_b _

出力

$ echo "${input_var}" | IFS=, read var_a var_b _
$ echo ${var_a}

$ echo ${var_b}

パイプ先はサブシェルで動作する。 var_aやvar_bのスコープはサブシェル内となるため、次の行の echo ${var_a} では何も出力されない。