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

Adding Date to Bash Command - passing a JSON string with shell expansions as part of a 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,但是当我将 $DATE 替换为日期 (2016-10-20) 时,它工作正常.

有什么建议吗?

正如发布的那样,shell 确实 扩展了 $DATE,但它也执行了 quote removal,这意味着 wget看到类似以下内容的 URL:

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

如您所见,双引号丢失了;为了保留它们,用双引号将整个 URL 括起来,并 \ 转义 JSON 要求的嵌入式

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

注:

  • 虽然 `...` 仍然适用于命令替换,但最好养成使用其现代后继者的习惯,$(...) - 参见 http://mywiki.wooledge.org/BashFAQ/082

  • 我已经更改了变量名,因为最好不要使用全大写的 shell-变量名以便 avoid conflicts with environment variables and special shell variables.

  • shell 仅在 引号字符串中执行扩展,而 引号字符串用于 文字 .
    heemayl's since-deleted answer 演示了使用带有嵌入式 \"s 的单个双引号字符串的替代方法:将可扩展的双引号字符串夹在两个单引号文字之间:"I am \"$HOME\"." vs. 'I am "'"$HOME"'".'