将文件的每一行分配为一个变量

5
我想要为文件中的每一行分配一个特定的变量,通过stdin输入,以便可以引用该行,例如line1,line2。
示例:
cat Testfile
Sample 1 -line1
Sample 2 -line2
Sample 3 -line3

line1是一个建议的变量名,还是文件的一部分? - Charles Duffy
一般而言,正确的方法是使用数组来实现,而不是使用变量间接寻址。 - Charles Duffy
i=0 while read line; do ((i++)) varname="$i" printf "$2" done - user2860658
line1是变量名。我该如何使用数组来实现它? - user2860658
2个回答

12

这是错误的做法,但恰好符合您的要求,使用离散变量:

while IFS= read -r line; do
    printf -v "line$(( ++i ))" '%s' "$line"
done <Testfile
echo "$line1" # to demonstrate use of array values
echo "$line2"

使用数组的正确方法,适用于bash 4.0或更高版本:

mapfile -t array <Testfile
echo "${array[0]}" # to demonstrate use of array values
echo "${array[1]}"

使用数组的正确方法,适用于bash 3.x:

declare -a array
while read -r; do
  array+=( "$REPLY" )
done <Testfile

查看BashFAQ #6以获取更深入的讨论。


1
+1 表示展示在不同的 bash 版本中的演示。 - jaypal singh

6

bash有一个内置函数可以实现此功能。 readarray从stdin(可以是您的文件)读取行,并将它们分配给数组的元素:

declare -a lines
readarray -t lines <Testfile

此后,您可以按行号引用这些行。第一行是"${lines[0]}",第二行是"${lines[1]}",以此类推。 readarray需要bash 4或更高版本(于2009年发布),并且可在许多现代Linux系统上使用。例如,Debian stable目前提供的是bash 4.2,而RHEL6提供的是4.1。但是,Mac OSX仍在使用bash 3.x。

这里唯一需要注意的是readarray(以及它的同义词mapfile)是最近才添加的,在像OS X和RHEL5/CentOS 5这样安装bash 3.x的系统上不可用。 - Charles Duffy
1
要将程序的输出分配给一个数组,请执行readarray -t lines < <(program_that_writes_to_stdout) - Tzunghsing David Wong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接