在bash脚本中正确转义Json命令行选项

时间:2012-12-26 07:41:09

标签: bash

我有接受JSON作为参数的实用程序。如何正确地转义json传递给实用程序? 例如:

ip="127.0.0.1"
action='{\"server_ip\":\"$ip\",\"action\":\"stop\"}'
./fix-utility -e $action

但JSON没有正确转义。

3 个答案:

答案 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