我有接受 JSON 作为参数的实用程序。如何正确转义 json 以传递给实用程序?例子:
ip="127.0.0.1"
action='{\"server_ip\":\"$ip\",\"action\":\"stop\"}'
./fix-utility -e $action
但是 JSON 没有正确转义。
我有接受 JSON 作为参数的实用程序。如何正确转义 json 以传递给实用程序?例子:
ip="127.0.0.1"
action='{\"server_ip\":\"$ip\",\"action\":\"stop\"}'
./fix-utility -e $action
但是 JSON 没有正确转义。
如果你想$ip
在字符串中插入 eg,你需要使用双引号。值中的双引号需要反斜杠转义。
ip="127.0.0.1"
action="{\"server_ip\":\"$ip\",\"action\":\"stop\"}"
./fix-utility -e "$action"
实际上,我建议不要将操作存储在变量中,除非您的示例省略了一些必要的关键内容。
bash 解释器认为双引号和单引号不同:虽然双引号让 bash 扩展包含的变量,但单引号不会。尝试简单:
echo "$BASH_VERSION"
4.1.5(1)-release
echo '$BASH_VERSION'
$BASH_VERSION
总之,有一个很好的可重用 bash 方式:
declare -A jsonVar
toJsonString() {
local string='{'
for var in ${!jsonVar[*]} ;do
string+="\"$var\":\"${jsonVar[$var]}\","
done
echo ${string%,}"}"
}
jsonVar[action]=stop
jsonVar[server_ip]=127.0.1.2
toJsonString
{"action":"stop","server_ip":"127.0.1.2"}
最后:
./fix-utility -e "$(toJsonString)"
"
如果像双引号这样的特殊字符必须是某些字符串的一部分,则可以改进这一点。
用更新的工具更新这个老问题。这个解决方案依赖于 python,jq
因为它是处理 JSON 文件和字符串的好工具。
使用本机 bash 字符串连接,无需手动转义任何内容并依赖于jq
执行所有转义。
# let's say I have need to include a variable within a string containing characters to escape
> my_string='a'"b"'c'
> echo -e "$my_string"
abc
> my_string='!(){'"$variable"'}[]'
> echo -e "$my_string"
!(){my_value_here}[]
# in effect, I'm concatenating these 3 strings together:
'!(){'
"$variable"
'}[]'
单引号防止 bash 解释,双引号允许 bash 解释变量。
现在,为了逃避,我建议使用 python 的jq
程序 ( pip install jq
)。
> ip="127.0.0.1"
> action='{"action":"stop","server_ip":"'"$ip"'"}'
> echo -e "${action}" | jq -cM '. | @text '
"'{\"action\":\"stop\",\"server_ip\":\"127.0.0.1\"}'"
对于上下文,以下是我正在使用的 bash 和 jq 版本:
> bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
> jq --version
jq-1.6