Dav*_*ave 7 scripting bash shell-script
我正在STDIN
使用read
如下方式将数据传递到数组中:
prompt$ cat myfile
a "bc" "d e" f
prompt$ read -a arr < myfile
Run Code Online (Sandbox Code Playgroud)
但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"
Run Code Online (Sandbox Code Playgroud)
我正在使用默认IFS
设置:\t\n
在bash
. 有几种方法可以使用不同的工具完成任务,但令我惊讶的是 read 不支持带引号的字符串。
将带引号的分隔列表放入数组中的任何其他建议?
我想不出一个很好的方法来做你所要求的,但是,如果你知道你的输入文件将包含空格分隔的令牌,这些令牌是 bash 的有效语法,那么像下面这样的东西可以工作:
declare -a arr="($(<myfile))"
Run Code Online (Sandbox Code Playgroud)
用这个:
IFS=$'\n' arr=( $(xargs -n1 <file) )
Run Code Online (Sandbox Code Playgroud)
IFS=$'\n'
将 bashs 内部字段分隔符设置为换行符。arr=( ... )
数组定义。xargs -n1 <file
xargs
读取file
最多 1 个参数。引号中的字符串保持在一起,因为它们被视为参数。输出(每行一个元素):
$ printf "%s\n" "${arr[@]}"
a
bc
d e
f
Run Code Online (Sandbox Code Playgroud)