如何将文件的不同行读取到不同的变量?

nee*_*eet 16 bash

我想将文本文件的不同行读取到不同的变量。例如

input.txt

line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar
Run Code Online (Sandbox Code Playgroud)

我想这个结果存储在变量var1var2var3var4这样

var1=line1 foo foobar bar
var2=line2 bar
Run Code Online (Sandbox Code Playgroud)

等等。

有人可以告诉我它是如何完成的。我尝试eval在 for 循环中使用。它似乎不起作用。

Sté*_*las 21

你会这样做:

unset -v line1 line2
{ IFS= read -r line1 && IFS= read -r line2; } < input.txt
Run Code Online (Sandbox Code Playgroud)

或者:

{ line1=$(line) && line2=$(line); } < input.txt
Run Code Online (Sandbox Code Playgroud)

(效率较低,因为line很少内置并且大多数 shell 需要 fork 来实现命令替换。line也不再是标准命令)。

要使用循环:

unset -v line1 line2 line3
for var in line1 line2 line3; do
  IFS= read -r "$var" || break
done < input.txt
Run Code Online (Sandbox Code Playgroud)

或者自动将变量的名称定义为line<++n>

n=1; while IFS= read -r "line$n"; do
  n=$((n + 1))
done < input.txt
Run Code Online (Sandbox Code Playgroud)

请注意,bash支持数组变量和readarray内置函数将行读入数组:

readarray -t line < input.txt
Run Code Online (Sandbox Code Playgroud)

然而要注意与大多数其他炮弹,bash数组的下标0而不是1(从继承开始ksh),所以第一个行会的${line[0]},不是${line[1]}(虽然作为@Costas显示,可以使readarray(又名mapfile)开始写在指数之值1(bash数组也与大多数其他外壳的稀疏数组相反)与-O 1)。

另请参阅:了解“IFS= read -r line”?


Cos*_*tas 13

我愿意为此类任务使用数组

mapfile -t -O 1 var <input.txt
Run Code Online (Sandbox Code Playgroud)

所以你会有每一行${var[1]}${var[2]}等等