我有接受JSON作为参数的实用程序。如何正确地转义json传递给实用程序? 例如:
ip="127.0.0.1"
action='{\"server_ip\":\"$ip\",\"action\":\"stop\"}'
./fix-utility -e $action
但JSON没有正确转义。
答案 0 :(得分:6)
如果你想插入例如在字符串中$ip
,您需要使用双引号。值中的双引号需要反斜杠转义。
ip="127.0.0.1"
action="{\"server_ip\":\"$ip\",\"action\":\"stop\"}"
./fix-utility -e "$action"
实际上,我建议不要将动作存储在变量中,除非你的例子省略了一些必要的东西。
答案 1 :(得分:1)
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)"
如果像"
双引号这样的特殊字母必须是某些字符串的一部分,这可以得到改善。
答案 2 :(得分:0)
使用更新的工具更新此旧问题。该解决方案依赖于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