Why JSON strings transform with bash shell

2019-09-20 17:54发布

问题:

I have this:

$ export foo=["foo","zoom"]
$ echo $foo
[foo,zoom]
$ export foo='["foo","zoom"]'
$ echo $foo
["foo","zoom"]

why is it that the " (double quote) chars get removed if I don't wrap in single quotes?

回答1:

Consider this:

$ echo "foo"
foo

We notice that there aren't any quotes in that string. From the bash manual:

Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘\’,

So double quotes are bash syntax. To get literal double quotes we need to escape them:

$ echo \"foo\"
"foo"

Another option to escaping is to use single quotes (again from the bash manual):

Enclosing characters in single quotes (‘'’) preserves the literal value of each character within the quotes.

So this is equivalent to the above command:

$ echo '"foo"'
"foo"

Applied to your specific example, we can see this:

$ export foo=["foo","zoom"]
$ declare -p foo
declare -- foo="[foo,zoom]"

The double quotes are parsed away.

But with

$ export foo='["foo","zoom"]'
$ declare -p foo
declare -x foo="[\"foo\",\"zoom\"]"

The single quotes have the same effect as escaping the double quotes.



标签: json bash shell