在 bash 4.4.12 上使用 jq 1.5 和这个单行IFS=_ read -r -a a < <(jq -ncj '["a","b","c"][]+"_"') ; printf '%s\n' "${a[@]}"我得到一个正确分隔的输出
一种
乙
C
分别对于元素 a、b 和 c,但是如果我尝试使用空分隔符进行相同的操作,如下所示:IFS= read -r -a a < <(jq -ncj '["a","b","c"][]+"\u0000"') ; printf '%s\n' "${a[@]}"那么我将只得到一个包含
美国广播公司
为什么这不像预期的那样工作?
此外,如果你尝试IFS= read -r -d '' -a a < <(jq -ncj '["a","b","c"][]+"\u0000"') ; printf '%s\n' "${a[@]},你会惊讶地得到一个只有第一个“ a ”元素的数组:
一种
我的目标是找到一种方法,而不用任何类型的循环迭代元素。
编辑:**readarray -d**不是解决方案,因为我需要在 4.4 版之前的 bash 中运行一段代码
使用readarray,它获得了-d类似于同一选项上read的bash4.4:
$ readarray -d $'\0' -t a < <(jq -ncj '["a","b","c"][]+"\u0000"')
$ declare -p a
declare -a a=([0]="a" [1]="b" [2]="c")
Run Code Online (Sandbox Code Playgroud)
-d ''也能用;由于 shell 字符串以空字符结尾,''因此从技术上讲,它是包含空字符的字符串。
在没有readarray -d支持的情况下,您可以使用while循环 with read,它应该适用于以下任何版本bash:
a=()
while read -d '' -r item; do
a+=("$item")
done < <( jq -ncj '["a","b","c"][]+"\u0000"' )
Run Code Online (Sandbox Code Playgroud)
这是你能做的最好的事情,除非你知道一些关于数组元素的知识,这会让你选择一个不属于任何元素的替代分隔符。