Macos 终端/外壳脚本:将变量添加到web地址-OS X

Macos 终端/外壳脚本:将变量添加到web地址-OS X,macos,shell,variables,webaddress,Macos,Shell,Variables,Webaddress,我正在尝试自动下载我们学校的天气数据。我不是一个技术高手,但我想我是学校里最好的。我的问题是试图将时间变量插入web地址。以下是我迄今为止所做的工作 目前这项工作: curl -o /Library/Server/Web/Data/Sites/wupmooksgmol.ca/weather/"$(date +%Y)"/"$(date +%Y-%m-%d)".weather.csv 'http://www.wunderground.com/weatherstation/WXDailyHistory

我正在尝试自动下载我们学校的天气数据。我不是一个技术高手,但我想我是学校里最好的。我的问题是试图将时间变量插入web地址。以下是我迄今为止所做的工作

目前这项工作:

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了,但它与大多数Linux发行版中使用的shell基本相同(如果不是相同的话)。一般来说,双引号内的任何内容都允许变量替换,但单引号内的任何内容都将完全按照字面意思理解(无替换)

尝试将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脚本中组装的任何输入替换都很有用。

我认为您需要:

#!/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"

我对引号的看法是这样的。如果你用单引号括起来,没有什么东西会被扩展,在里面放变量也没有意义。如果使用双引号,变量将被展开,中带有空格的内容将被“固定在一起”,并被视为单个参数。技术不是很好,但很有效。

非常好。这很有效。不过,shell脚本更有用,因此我将继续使用它。@iQuestion很乐意提供帮助。为了在以后的shell脚本中提供参考,请尝试通过在命令行上输入
manbash
来阅读
bash
的优秀手册页面。除了变量替换之外,它还讨论了脚本语言的其他有用特性,这些特性允许您构建非常复杂的控制逻辑。