如何在bash中将变量用作数组名称

时间:2012-11-30 21:43:03

标签: arrays bash variables

我目前正在处理一个从stdin接收输入的脚本,然后逐行将输入加载到数组中以进行进一步处理。虽然如果直接设置数组名称,数组工作正常,但当我尝试使用变量作为数组名时,我无法使数组部分正常工作,代码本身如下:

input=$(</dev/stdin)
# back up the field separator for later
OLDIFS=$IFS
# set the field separator to newline
IFS=$'\n'
# populate an array from that variable, as delimited by the IFS
lines=($input)

这就是我尝试将数组名称设置为变量

arrayname="something"
eval $arrayname=($input)

但不幸的是,当我去运行时,我收到以下错误:

./f.sh: line 53: syntax error near unexpected token `('
./f.sh: line 53: `                      eval $arrayname=($input)'

说完所有这些之后,我想知道是否有人会知道我能做些什么来使这项工作正常进行?谢谢!

3 个答案:

答案 0 :(得分:3)

而不是使用IFS,这在你的情况下是无用的(即使我是IFS的狂热粉丝,我倾向于只在必要时使用它!),有一个更好的以及将文件加载到数组中的更有效方法。顺便提一下,它并不是很有名:它是命令mapfile(在你的终端中运行bash类型help mapfile以获取更多信息)。

因此,

mapfile lines

将从标准输入读取并将每一行存储在数组lines中。这也存储了尾随的新行字符,因此如果要修剪它,请使用-t选项:

mapfile -t lines

要打印出数组,每个条目一行,请使用:

printf '%s\n' "${lines[@]}"

(观察引用"${lines[@]}")。

请注意,使用eval是邪恶的!

您的主要问题是使用变量作为数组名称。 bash没有其他语言中的指针。如果不使用eval,将很难使用存储在变量中的数组名称(除非您使用小技巧)。但是,正如我已经说过的那样,eval是邪恶的。也许你应该花一点时间考虑你的设计,可能还有另一种(更好的?)方式来实现你想要的东西。

答案 1 :(得分:1)

使用间接:

men=(Jack John Joe)
women=(Zoe Zelda Zanna)
gender=women[@]
echo ${!gender}

答案 2 :(得分:0)

read -a arr
printf '%s\n' ${arr[@]}

是解决方案吗?