将每行文件分配为变量

时间:2014-03-17 22:23:47

标签: bash

我希望通过stdin分配一个文件的每一行,一个特定的变量可用于引用该确切的行,例如line1,line2

示例:

cat Testfile
Sample 1 -line1
Sample 2 -line2
Sample 3 -line3

2 个答案:

答案 0 :(得分:11)

使用离散变量执行此操作的错误方法,但正是您所要求的:

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 :(得分:3)

bash有一个内置函数来做到这一点。 readarray从stdin(可以是你的文件)读取行并为它们分配数组元素:

declare -a lines
readarray -t lines <Testfile

此后,您可以按编号参考行。第一行是"${lines[0]}",第二行是"${lines[1]}"等等。

readarray需要bash版本4(released in 2009)或更好,并且在许多现代Linux系统上都可用。例如,Debian stable目前提供bash 4.2,而RHEL6提供4.1。不过,Mac OSX仍在使用bash 3.x。