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"
}
}'
の解釈は、HTTP POST要求データに渡される-dump
orと同じです。curl
HTMLページのテキストレンダリングをダンプする//オプションについて混同する必要があります。 WebブラウザではなくHTMLレンダリングを実行せず、実行しても出力で見つけることはできません。-d ump
--data ump
ump
-dump
lynx
elinks
w3m
curl
<title>
HTTP要求を実行するためにすでに使用しているperl
代わりに使用しているため、モジュールをcurl
使用することもできます。これにより、エラー状況をはるかに簡単かつきれいに処理できます。perl
LWP