Bash 将文件的每一行指定为变量

Bash 将文件的每一行指定为变量,bash,Bash,我希望通过stdin为文件的每一行指定一个特定的变量,该变量可用于引用该行,例如第1行、第2行 例如: cat Testfile Sample 1 -line1 Sample 2 -line2 Sample 3 -line3 这样做的方法是错误的,但正是您要求的,使用离散变量: while IFS= read -r line; do printf -v "line$(( ++i ))" '%s' "$line" done <Testfile echo "$line1" # to

我希望通过stdin为文件的每一行指定一个特定的变量,该变量可用于引用该行,例如第1行、第2行

例如:

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

这样做的方法是错误的,但正是您要求的,使用离散变量:

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

done
bash
有一个内置函数来实现这一点
readarray
从stdin(可以是您的文件)中读取行,并为它们分配数组元素:

declare -a lines
readarray -t lines <Testfile
declare-a行

readarray-t lines是
line1
建议的变量名,或文件的一部分?一般来说,正确的方法是使用数组,而不是使用变量间接寻址。读取line时i=0;do((i++)varname=“$i”printf“$2”doneline1将是变量名。我怎样才能使用数组呢?这里唯一的问题是,
readarray
(就像它的同义词
mapfile
)是最近才添加的,并且在发布bash 3.x的系统上不可用,比如OS x和RHEL5/CentOS 5,在不使用
-t
的情况下使用
readarray
会在数组内容中留下尾随的换行符——这很少是人们真正想要的。使用不同的
bash
版本演示时,使用+1。第一个版本在初始(“错误方式”)版本中有一个错误——缺少循环中的增量。现在应该可以工作了。
declare -a array
while read -r; do
  array+=( "$REPLY" )
done <Testfile
declare -a lines
readarray -t lines <Testfile