如何在Shell中的变量中保留双引号

时间:2019-05-20 07:36:57

标签: shell

我使用jq处理json str,但是shell不保留双引号。我无法添加转义字符,因为json str是从外部发送的。我想保留原始字符串的双引号。

动态生成json字符串,数据内容未定义,我不能使用sed添加双引号

# The json_str is externally sent. 
# Assume that the content is "{"name": "John", "age": 0}"
# I want get the name

echo "$json_str" | jq -r ".name"

我希望输出是“ John”,但实际输出是

parse error: Invalid literal at line 1, column 6

3 个答案:

答案 0 :(得分:1)

您可以使用单引号

json_str='{"name", "John", "age": 22}'

或转义双引号

json_str="{\"name\", \"John\", \"age\": 22}"

答案 1 :(得分:1)

请注意,此答案适用于问题的原始版本。

  

我希望输出是“约翰”

除了测试用例所引入的错误之外,还存在使用选项-r的问题:

   ·   --raw-output / -r:

       With  this  option, if the filter´s result is a string then it will
       be written directly to standard output rather than being  formatted
       as a JSON string with quotes.

如果您不想输出彩色,则可以使用-M来代替

   ·   --colour-output / -C and --monochrome-output / -M:

       By  default,  jq outputs colored JSON if writing to a terminal. You
       can force it to produce color even if writing to a pipe or  a  file
       using -C, and disable color with -M.

答案 2 :(得分:0)

JSON示例中的引号是JSON布局的一部分,而不是文件的内容。
当您想要报价时,可以使用

echo "${json_str}" | jq -r ".name" | sed 's/.*/"&"/'

name=$(echo "${json_str}" | jq -r ".name" | sed 's/.*/"&"/')