Answers:
这是一种实现方法:
while read line
do
my_array=("${my_array[@]}" $line)
done
echo ${my_array[@]}
如果只运行它,它将一直从标准输入中读取内容,直到您按Ctrl + D(EOF)为止。之后,您输入的行将在中my_array
。有些人可能会发现此代码令人困惑。循环的主体基本上说my_array = my_array + element
。
一些有趣的文档:
《高级Bash脚本指南》中有关于数组的精彩章节
该联机帮助页读取内置
来自thegeekstuff.com的15个数组示例
read -r
有时非常有用/重要... Stefano到“内置的手册页”的链接说明了它的目的...(以防止反斜杠解释)。
而且不会每次都重新创建数组的(尽管需要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
如此……
那单线怎么样?)
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读取中给出的解决方法更简单,更直接。
cat war_and_peace.txt | ./array_test.sh
。