终端 / 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”并被视为单个参数。不是很技术,但它有效。
我正在尝试自动下载我们学校的天气数据。我不是一个技术高手,但我想我是学校里最好的。我的问题是试图将时间变量插入网址。这是我到目前为止所做的。
目前有效:
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”并被视为单个参数。不是很技术,但它有效。