我想将文本文件的不同行读取到不同的变量。例如
input.txt
:
line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar
Run Code Online (Sandbox Code Playgroud)
我想这个结果存储在变量var1
,var2
,var3
和var4
这样
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
)。
Cos*_*tas 13
我愿意为此类任务使用数组
mapfile -t -O 1 var <input.txt
Run Code Online (Sandbox Code Playgroud)
所以你会有每一行${var[1]}
,${var[2]}
等等
归档时间: |
|
查看次数: |
7467 次 |
最近记录: |