我使用如下方式将数据传递STDIN
到数组中:read
prompt$ cat myfile
a "bc" "d e" f
prompt$ read -a arr < myfile
但read
似乎没有注意引用的字符串,并为我提供了一个包含 5 个元素的数组:
prompt$ echo ${#arr[@]}
5
prompt$ echo ${arr[@]:0}
a "bc" "d e" f
prompt$ echo ${arr[2]}
"d
prompt$ echo ${arr[3]}
e"
我使用默认IFS
设置:\t\n
in bash
.有多种方法可以使用不同的工具来完成任务,但令我惊讶的是 read 不支持带引号的字符串。
对于将带引号的分隔列表放入数组中还有其他建议吗?
答案1
我想不出一个很好的方法来完成您所要求的操作,但是,如果您知道您的输入文件将包含空格分隔的标记,这些标记是 bash 的有效语法,那么类似以下的内容可以工作:
declare -a arr="($(<myfile))"
答案2
用这个:
IFS=$'\n' arr=( $(xargs -n1 <file) )
IFS=$'\n'
将 bash 内部字段分隔符设置为换行符。arr=( ... )
数组定义。xargs -n1 <file
xargs
读取file
最多 1 个参数。引号中的字符串保持在一起,因为它们被读取为参数。
输出(每行一个元素):
$ printf "%s\n" "${arr[@]}"
a
bc
d e
f