bash 函数输入 $1 仅处理字符串的第一个单词和格式问题

bash function input $1 is only processing first word of string & formatting issue

我的BASH函数:

json_format () {
        echo '{
                "question": "';echo "";echo '",' 
}

用于:

json_format ${questions[$Q_counter]}

正在返回:

{
                "question": "
VM
",

而不是预期的 json 格式和字符串:

{
    "question": "VM CPU is at 100% and you'r jumpbox creds be broken! What do you do?",

该字符串似乎在第一个单词 "VM" 之后的 space 处被截断,并且这些回显命令的格式有点偏离。我怎样才能纠正我的功能?谢谢!

从 shell 生成 JSON 的理想方法是使用 jq 等真正理解格式的工具:

json_format() {
  jq -n --arg q "" '{"question": $q}'
}

...或者,如果您有 Python 解释器,也可以使用 built-in json module

json_format() {
  python -c 'import sys, json; print json.dumps({"question": sys.argv[1]})' ""
}

但是,如果您没有任何这些工具,至少尽最大努力尝试转义:

json_format() {
  local s=
  s=${s//'\'/'\'}   # replace \ with \
  s=${s//'"'/'\"'}   # replace " with \"
  s=${s//$'\n'/'\n'} # replace newline literals with \n
  printf '{\n\t"question": "%s"\n}\n' "$s"
}

...或者,一次处理一个值:

json_format() {
  local s=
  s=${s//'\'/'\'}   # replace \ with \
  s=${s//'"'/'\"'}   # replace " with \"
  s=${s//$'\n'/'\n'} # replace newline literals with \n
  printf '%s\n' "$s"
}

...为每个要格式化的字符串单独调用,如:

cat <<EOF
{
  "question": "$(json_format "$question")",
  "image": "$(json_format "$image_url")",
  "choices": [ ],
  "correct": [ "$(json_format "$answer")" ],
  "explanation": "$(json_format "$explanation")"
}
EOF

这将正确处理天真的方法会产生有效但实际上无效的情况 JSON。例如考虑:

# naive string substitution will fail here because it won't escape double quotes
json_format 'How do you spell "hello" in Spanish?'

# naive string substitution will fail here because it won't escape the newline
json_format $'This question has\ntwo lines'

# naive string substitution will fail here because it won't escape the backslash
json_format 'This question ends in a backslash: \'

请注意,在上述所有内容中,引号 -- 确保字符串作为单个参数传递。