Bash の読み取りコマンドについて、非常に基本的なことが抜けているに違いありません。シェル プロンプトで、3 つの入力フィールドを対応する変数に割り当てることができません。
% echo a b c | read x1 x2 x3
% echo $x1 $x2 $x3
%
これはうまくいきます:
% echo a b c | while read x1 x2 x3 ; do
> echo $x1 $x2 $x3
> done
a b c
%
1行の入力を読むだけです。ループのサブプロセスが終了すると x1、x2、および x3 の値が失われるため、while ループの使用はここでは正しくありません。それらにアクセスするすべてのコードをループ本体内に配置する必要があります (そして、「明確にする」ために、おそらく最後で中断します)。これは非常にハックのようです。if コマンド内で使用しても同様に機能しますが、while ループと同じサブプロセスの問題が発生します。
% echo a b c | if read x1 x2 x3 ; then echo $x1 $x2 $x3; fi
a b c
% echo $x1
BASH_VERSION は「4.2.45(1)-release」と報告します。