我正在尝试从 city-data.com 上删除一些数据。我想要得到城市和州,这是我能做到的。但如果邮政编码不存在,我似乎无法运行 if/else。
baseURL="https://www.city-data.com/zips"
errorResponse=" <title>Page not found - City-Data.com</title>"
location=$( curl -s -dump "$baseURL/$1.html" | grep -i '<title>' | cut -d\( -f2 | cut -d\) -f1 )
if $location = $errorResponse;
then
echo "That zipcode does not exist"
exit 0
else
echo "ZIP code $1 is in " $location
fi
当我运行时,该脚本会得到这个输出bash getZipcode.sh 30001
getZipecode.sh: line 10: <title>Page: command not found
ZIP code 30001 is in <title>Page not found - City-Data.com</title>
第 10 行是if $location = $errorResponse;
为了简洁起见,我删除了脚本中放入的作者标题和 She-Bang。
有人能帮我解决这个问题吗?
答案1
你的说法有错误if
,你可以尝试一下:
baseURL="https://www.city-data.com/zips"
errorResponse=" <title>Page not found - City-Data.com</title>"
location=$( curl -s -dump "$baseURL/$1.html" | grep -i '<title>' | cut -d\( -f2 | cut -d\) -f1 )
if [ "$location" = "$errorResponse" ];
then
echo "That zipcode does not exist"
exit 0
else
echo "ZIP code $1 is in " $location
fi
问题是在执行 if 语句时,程序尝试运行变量的内容,就好像它是路径中的系统命令一样。
有关如何在 bash 中比较字符串的更多信息,您可以查看这里。
答案2
与大多数网站一样,当找不到页面时,该网站会返回 404 HTTP 响应代码,因此您可能需要使用它来获得更可靠的方法:
export ZIP="$1"
curl -sw '%{http_code} %{errormsg}\n' "https://www.city-data.com/zips/$ZIP.html" |
perl -ne '
$location = $1 if m{<title>.*?\((.*?)\)};
if (eof) {
if (/^(\d+) (.*)/) {
if ($1 eq "200") {
if (defined($location)) {
print "ZIP code $ENV{ZIP} is in $location\n"
} else {
die "Can'\''t find location in the HTML\n";
}
} elsif ($1 eq "404") {
die "That ZIP code does not exist\n"
} else {
die "HTTP error: $2\n"
}
} else {
die "curl did not return an HTTP code\n"
}
}'
请注意, 的-dump
解释与或curl
相同,即作为 HTTP POST 请求数据传递。您一定对//选项感到困惑,该选项转储 HTML 页面的文本呈现。不是 Web 浏览器,它不执行 HTML 渲染,如果执行了,您将无法在其输出中找到。-d ump
--data ump
ump
-dump
lynx
elinks
w3m
curl
<title>
由于我们已经使用perl
,而不是使用curl
来执行 HTTP 请求,因此我们还可以使用perl
的LWP
模块,这将使错误情况的处理更加容易和干净。