向Bash命令添加日期-将带有shell扩展的JSON字符串作为URL的一部分传递

向Bash命令添加日期-将带有shell扩展的JSON字符串作为URL的一部分传递,bash,string-interpolation,quoting,Bash,String Interpolation,Quoting,我有一个简单的脚本: DATE=`date +%Y-%m-%d` COUNT=`wget -q0- 'https://url.com/query?q={"query_string":"helloworld","date":"$DATE 00:00:00"}'` echo $COUNT 这样做时,API不识别$DATE,但是当我用日期(2016-10-20)替换$DATE时,它工作正常 有什么建议吗 如前所述,shell确实扩展了$DATE,但它也执行了,这意味着wget将以下内容视为URL:

我有一个简单的脚本:

DATE=`date +%Y-%m-%d`
COUNT=`wget -q0- 'https://url.com/query?q={"query_string":"helloworld","date":"$DATE 00:00:00"}'`
echo $COUNT 
这样做时,API不识别
$DATE
,但是当我用日期(2016-10-20)替换
$DATE
时,它工作正常

有什么建议吗

如前所述,shell确实扩展了
$DATE
,但它也执行了,这意味着
wget
将以下内容视为URL:

https://url.com/query?q={query_string:helloworld,date:2016-10-20 00:00:00} # !! missing "s
如您所见,双引号丢失;为了保留它们,将整个URL用双引号括起来,
\
-转义JSON所需的嵌入URL

date=$(date +%Y-%m-%d)
count=$(wget -q0- "https://url.com/query?q={\"query_string\":\"helloworld\",\"date\":\"$date 00:00:00\"}")
echo "$count"
现在,
wget
看到了如下内容,正如预期的那样:

https://url.com/query?q={"query_string":"helloworld","date":"2016-10-20 00:00:00"}
注:

  • 虽然
    `…`
    仍然适用于命令替换,但最好养成使用其现代后继命令的习惯,
    $(…)
    -请参阅

  • 我已经更改了变量名,因为最好不要使用所有大写的shell变量名,以便更好地使用

  • shell仅在双引号字符串中执行扩展,而单引号字符串用于文本。
    因为删除的答案演示了一种替代方法,即使用嵌入
    \“
    s的单双引号字符串:在两个单引号文本之间夹一个可扩展的双引号字符串:
    “我是”$HOME\“
    “我是”“$HOME”

发布时,shell确实扩展了
$DATE
,但它也执行了,这意味着
wget
将以下内容视为URL:

https://url.com/query?q={query_string:helloworld,date:2016-10-20 00:00:00} # !! missing "s
如您所见,双引号已丢失;为了保留它们,将整个URL括在双引号中,
\
-转义JSON所需的嵌入URL

date=$(date +%Y-%m-%d)
count=$(wget -q0- "https://url.com/query?q={\"query_string\":\"helloworld\",\"date\":\"$date 00:00:00\"}")
echo "$count"
现在,
wget
看到了如下内容,正如预期的那样:

https://url.com/query?q={"query_string":"helloworld","date":"2016-10-20 00:00:00"}
注:

  • 虽然
    `…`
    仍然适用于命令替换,但最好养成使用其现代后继命令的习惯,
    $(…)
    -请参阅

  • 我已经更改了变量名,因为最好不要使用所有大写的shell变量名,以便更好地使用

  • shell仅在双引号字符串中执行扩展,而单引号字符串用于文本。
    因为删除的答案演示了一种替代方法,即使用嵌入
    \“
    s的单双引号字符串:在两个单引号文本之间夹一个可扩展的双引号字符串:
    “我是”$HOME\“
    “我是”“$HOME”


我正在使用反引号保存到一个变量中——除非我在其中有$DATE,否则它可以正常工作(我把反引号放在上面的例子中,它只是不想在文章中渲染。上面的片段对我来说很好。渲染日期用于
wget
调用。你能说一点关于你的环境的信息吗?上面的输出如何?到底是什么经过了连接?好的,从我的理解来看,wget命令很好,但是应用程序出于某种原因不想识别它。基本上,它是以JSON格式向web API发送GET命令。正如我所说,如果我只是手动输入日期而不是使用该命令,它会像一个符咒一样工作。我手动输入2016-10-20而不是使用$date有什么区别吗?Doe是将其标记为不同的字符串类型还是添加web应用程序可能无法识别的其他字符?
wget
命令不正确,因为引号删除-您发送的不是有效的JSON-至少基于您发布的代码。如果发布的代码是您实际使用的代码,我的答案应该提供解决方案。如果如果不是,请发布实际代码-理想情况下是一个-并且,在将来,请从一开始就这样做。如果答案解决了您的问题,请单击大复选标记接受它(✓) 在它旁边,也可以选择向上投票(向上投票需要至少15个信誉点)。如果您发现其他答案有帮助,请向上投票。接受和向上投票有助于未来的读者。请参阅。如果您的问题尚未完全回答,请提供反馈。我正在使用反引号保存到变量,除非我在其中有$DATE,否则效果很好(我把反引号放在上面的例子中,它只是不想在文章中渲染。上面的片段对我来说很好。渲染日期用于
wget
调用。你能说一点关于你的环境的信息吗?上面的输出如何?到底是什么经过了连接?好的,从我的理解来看,wget命令很好,但是应用程序出于某种原因不想识别它。基本上,它是以JSON格式向web API发送GET命令。正如我所说,如果我只是手动输入日期而不是使用该命令,它会像一个符咒一样工作。我手动输入2016-10-20而不是使用$date有什么区别吗?Doe是将其标记为不同的字符串类型还是添加web应用程序可能无法识别的其他字符?
wget
命令不正确,因为引号删除-您发送的不是有效的JSON-至少基于您发布的代码。如果发布的代码是您实际使用的代码,我的答案应该提供解决方案。如果如果不是,请发布实际代码-理想情况下是一个-并且,在将来,请从一开始就这样做。如果答案解决了您的问题,请单击大复选标记接受它(✓) 在它旁边,也可以选择向上投票(向上投票需要至少15个信誉点)。如果您发现其他答案有帮助,请向上投票。接受和向上投票有助于未来的读者。请参阅。如果您的问题尚未完全回答,请提供反馈。