从文件中读取带空格的带引号的数组元素?

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\nbash. 有几种方法可以使用不同的工具完成任务,但令我惊讶的是 read 不支持带引号的字符串。

将带引号的分隔列表放入数组中的任何其他建议?

dha*_*hag 7

我想不出一个很好的方法来做你所要求的,但是,如果你知道你的输入文件将包含空格分隔的令牌,这些令牌是 bash 的有效语法,那么像下面这样的东西可以工作:

declare -a arr="($(<myfile))"
Run Code Online (Sandbox Code Playgroud)

  • 在它的核心,`declare -a "arr=($MYVAR)"` 将对变量执行相同的操作。 (2认同)

cha*_*aos 5

用这个:

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)