Jon*_*Jon 5 arrays bash json jq
我有一个bash数组
X=("hello world" "goodnight moon")
Run Code Online (Sandbox Code Playgroud)
我想变成一个json数组
["hello world", "goodnight moon"]
Run Code Online (Sandbox Code Playgroud)
有没有一种好方法让我把它变成一个json数组的字符串,而不用在子shell中循环键?
(for x in "${X[@]}"; do; echo $x | sed 's|.*|"&"|'; done) | jq -s '.'
Run Code Online (Sandbox Code Playgroud)
这显然不起作用
echo "${X[@]}" | jq -s -R '.'
Run Code Online (Sandbox Code Playgroud)
Wee*_*ble 19
从 jq 1.6 开始你可以这样做:
jq --compact-output --null-input '$ARGS.positional' --args -- "${X[@]}"
Run Code Online (Sandbox Code Playgroud)
给予:
["hello world","goodnight moon"]
Run Code Online (Sandbox Code Playgroud)
这样做的好处是根本不需要转义。它处理包含换行符、制表符、双引号、反斜杠和其他控制字符的字符串。(嗯,它不处理 NUL 字符,但你首先不能将它们放在 bash 数组中。)
kev*_*kev 17
你可以这样做:
X=("hello world" "goodnight moon")
printf '%s\n' "${X[@]}" | jq -R . | jq -s .
Run Code Online (Sandbox Code Playgroud)
[
"hello world",
"goodnight moon"
]
Run Code Online (Sandbox Code Playgroud)
这个 ...
X=("hello world" "goodnight moon" 'say "boo"' 'foo\bar')
json_array() {
echo -n '['
while [ $# -gt 0 ]; do
x=${1//\\/\\\\}
echo -n \"${x//\"/\\\"}\"
[ $# -gt 1 ] && echo -n ', '
shift
done
echo ']'
}
json_array "${X[@]}"
Run Code Online (Sandbox Code Playgroud)
...产量:
["hello world", "goodnight moon", "say \"boo\"", "foo\\bar"]
Run Code Online (Sandbox Code Playgroud)
如果您打算做很多这样的事情(正如您不愿使用子shell 所暗示的那样),那么诸如此类的不依赖于任何子进程的事情可能对您有利。