ファイルの異なる行を別の変数として読み取るには?

ファイルの異なる行を別の変数として読み取るには?

テキストファイルの他の行を別の変数として読みたいです。例えば

input.txt:

line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar

この結果を次のように変数に保存したいと思いますvar1var2var3var4

var1=line1 foo foobar bar
var2=line2 bar

など。

誰かがそれがどのように完了したかを教えてもらえますか?evalforループで試してみました。これはうまくいかないようです。

ベストアンサー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(配列は他のほとんどのシェルの場合とは反対です)。mapfilebash足りない配列)と-O 1)。

また見なさい:「IFS=read -r line」を理解しましたか?

おすすめ記事