4

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

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

但是 JSON 没有正确转义。

4

3 回答 3

6

如果你想$ip在字符串中插入 eg,你需要使用双引号。值中的双引号需要反斜杠转义。

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

实际上,我建议不要将操作存储在变量中,除非您的示例省略了一些必要的关键内容。

于 2012-12-26T07:56:52.360 回答
2

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)"

"如果像双引号这样的特殊字符必须是某些字符串的一部分,则可以改进这一点。

于 2012-12-26T08:45:11.017 回答
1

用更新的工具更新这个老问题。这个解决方案依赖于 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
于 2019-07-15T14:42:26.707 回答