如何将bash数组格式化为JSON数组

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)

  • 精神上+1和+10:唯一安全正确的答案.要处理嵌入的换行符,`for f in"$ {X [@]}"; 做printf'%s'"$ f"| jq -R -s.; 完成| jq -s .` (2认同)
  • 这会将空数组转换为 `[ "" ]` (2认同)

Joh*_*ger 7

这个 ...

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 所暗示的那样),那么诸如此类的不依赖于任何子进程的事情可能对您有利。