0

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

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)'

说了这么多,我想知道是否有人会知道我可以做些什么来使这项工作正常工作?谢谢!

4

3 回答 3

3

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

因此,

mapfile lines

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

mapfile -t lines

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

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

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

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

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

于 2012-11-30T21:54:20.057 回答
1

使用间接:

men=(Jack John Joe)
women=(Zoe Zelda Zanna)
gender=women[@]
echo ${!gender}
于 2012-11-30T22:48:28.390 回答
0
read -a arr
printf '%s\n' ${arr[@]}

这是解决方案吗?

于 2012-11-30T21:44:52.873 回答