如何在Bash中将用户输入读取为数组?


15

如何在bash外壳程序中以数组形式读取用户输入?


我假设您想从stdin中阅读?我的答案也将适用于执行cat war_and_peace.txt | ./array_test.sh
Stefano Palazzo

或者干脆./array_test.sh < war_and_peace.txt
伊莱亚·卡根

Answers:


14

这是一种实现方法:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

如果只运行它,它将一直从标准输入中读取内容,直到您按Ctrl + D(EOF)为止。之后,您输入的行将在中my_array。有些人可能会发现此代码令人困惑。循环的主体基本上说my_array = my_array + element

一些有趣的文档:


3
read -r有时非常有用/重要... Stefano到“内置的手册页”的链接说明了它的目的...(以防止反斜杠解释)。
Peter.O 2011年

10

使用以下内容阅读:

read -a arr

对于打印,请使用:

for elem in ${arr[@]}
do 
  echo $elem
done

4

而且不会每次都重新创建数组的(尽管需要bash 3.1或更高版本):

array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
    [[ $line ]] || break  # break if line is empty
    array+=("$line")
done

printf '%s\n' "Items read:"
printf '  «%s»\n' "${array[@]}"

有关更多信息,请参见http://mywiki.wooledge.org/BashFAQ/001

与往常一样,为避免编写错误,请阅读http://mywiki.wooledge.org/BashGuide,并避免使用tldp指南(如Advanced bash脚本指南)。


好的链接...感谢您指出IFS问题。不读为零,“读”会删除所有开头和结尾的空格……当然也是-r如此……
Peter.O 2011年

0

那单线怎么样?)

arr=( $(cat -) )
echo ${arr[@]}

编辑:

bash

arr=(val1 val2 ...)

分配给数组的方法。将其与命令替换结合使用,您可以从管道中读取数组,这无法read直接实现:

echo -e "a\nb" | read -a arr
echo ${arr[@]}

你会发现,它的输出没有因这样的事实read不执行任何操作时,stdin被从管道中的管道可以在子shell中运行,这样的变量可能根本不会被使用。

使用此答案建议的方式:

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

它提供a b的方法比将Read值的答案从管道读取到shell变量中以及在管道未设置值后以bash读取中给出的解决方法更简单,更直接。


你测试了吗?
cmak.fr,

@ cmak.fr是的,它对我有用
Quark

@Melebius我已经附加了对它的解释以及这种单线的优点。
徐佳浩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.