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: \'
请注意,在上述所有内容中,引号 -- 确保字符串作为单个参数传递。
我的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: \'
请注意,在上述所有内容中,引号 -- 确保字符串作为单个参数传递。