テキストファイルの他の行を別の変数として読みたいです。例えば
input.txt
:
line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar
この結果を次のように変数に保存したいと思いますvar1
。var2
var3
var4
var1=line1 foo foobar bar
var2=line2 bar
など。
誰かがそれがどのように完了したかを教えてもらえますか?eval
forループで試してみました。これはうまくいかないようです。
ベストアンサー1
あなたはこれを行います:
unset -v line1 line2
{ IFS= read -r line1 && IFS= read -r line2; } < input.txt
または:
{ line1=$(line) && line2=$(line); } < input.txt
(line
組み込み機能がほとんどなく、ほとんどのシェルでコマンド置換を実装するためにフォークが必要であるため、効率が低下します。これは標準コマンドではline
ありません)。
ループを使用してください。
unset -v line1 line2 line3
for var in line1 line2 line3; do
IFS= read -r "$var" || break
done < input.txt
または、変数名を次のように自動的に定義しますline<++n>
。
n=1; while IFS= read -r "line$n"; do
n=$((n + 1))
done < input.txt
bash
行を配列に読み込むための配列変数と組み込みreadarray
関数がサポートされています。
readarray -t line < input.txt
しかし、他のほとんどのシェルとは異なり、配列インデックスbash
は1ではなく0から始まるので(から継承されます)、最初の行は代わりにありますksh
(たとえ${line[0]}
${line[1]}
@Costasが示すように、インデックス1に値の書き込みを開始させることができますreadarray
(配列は他のほとんどのシェルの場合とは反対です)。mapfile
bash
足りない配列)と-O 1
)。
また見なさい:「IFS=read -r line」を理解しましたか?