我目前正在处理一个从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)'
说完所有这些之后,我想知道是否有人会知道我能做些什么来使这项工作正常进行?谢谢!
答案 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[@]}
是解决方案吗?