如何针对 Bash 中现有的响应进行错误检查?

如何针对 Bash 中现有的响应进行错误检查?

我正在尝试从 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 umpump-dumplynxelinksw3mcurl<title>

由于我们已经使用perl,而不是使用curl来执行 HTTP 请求,因此我们还可以使用perlLWP模块,这将使错误情况的处理更加容易和干净。

相关内容