终端 / shell 脚本:将变量添加到网址 - OS X

terminal / shell script: adding variable to web address - OS X

我正在尝试自动下载我们学校的天气数据。我不是一个技术高手,但我想我是学校里最好的。我的问题是试图将时间变量插入网址。这是我到目前为止所做的。

目前有效:

curl -o /Library/Server/Web/Data/Sites/wupmooksgmol.ca/weather/"$(date +%Y)"/"$(date +%Y-%m-%d)".weather.csv 'http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBRITISH322&day=16&month=1&year=2015&graphspan=day&format=1'

但是,在网址中,它只下载2015年1月16日的天气数据。我想将当前的日期、月份和年份输入网址本身。因此,它每天在 23:57 下载当天的天气数据。我在以下方面尝试了很多变体,但没有成功:

curl -o /Library/Server/Web/Data/Sites/wupmooksgmol.ca/weather/"$(date +%Y)"/"$(date +%Y-%m-%d)".weather.csv 'http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBRITISH322&day=“$(date +%d)”&month=“$(date +%m)”&year=“$(date +%Y)”&graphspan=day&format=1'

我还尝试了这个 shell 脚本的多种变体:

#!/bin/bash

day=$(date '+%d')
month=$(date '+%m')
year=$(date '+%Y')
ymd=$(date '+%Y-%m-%d')

curl -o /Library/Server/Web/Data/Sites/wupmooksgmol.ca/weather/“$year"/"$ymd".weather.csv 'http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBRITISH322&day=“$day”&month=“$month”&year=“$year”&graphspan=day&format=1'

感谢您提供的任何帮助。

我认为您可能 运行 对如何包装字符串有疑问 — 具体来说,就是您使用的引号种类。我有一段时间没有使用 OSX,但它基本上是相同的(如果 相同) shell 用于大多数 Linux 发行版.通常,双引号内的任何内容都允许变量替换,但单引号内的任何内容都将完全按字面意义(无替换)。

尝试用双引号而不是单引号将 URL 括起来,然后 不要 将该字符串中的变量用引号括起来。所以:

curl "http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBRITISH322&day=$(date +%d)&month=$(date +%m)&year=$(date +%Y)&graphspan=day&format=1"

我自己测试上面的内容似乎得到了当前的结果,但是我从来没有使用过这个 API,所以我不确定我在看什么。 ^_^ 我可以读取一个日期,结果是今天的结果。

以后,与其向站点发送可能是虚假请求的垃圾邮件,不如尝试使用 echo 测试您的 URL 语法。这只会将您的字符串输出到终端,因此您可以在不发送请求的情况下对其进行调试。通过使用 echo 测试得到正确的输出后,请尝试将其用作 curl 的目标。此技术对于调试 任何 您尝试在 shell 脚本中 assemble 的输入替换很有用。

我想你需要这个:

#!/bin/bash

day=$(date '+%d')
month=$(date '+%m')
year=$(date '+%Y')
ymd=$(date '+%Y-%m-%d')

curl -o weather.csv "http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBRITISH322&day=${day}&month=${month}&year=${year}&graphspan=day&format=1"

我对引号的看法是这样的。如果用单引号将内容括起来,则不会展开任何内容,也没有必要将变量放入其中。如果您使用双引号,变量将得到扩展,并且包含空格的内容将得到“held together”并被视为单个参数。不是很技术,但它有效。