2014-03-04 77 views
1

我想寫一個簡短的腳本,檢查從5位數字我們的郵政編碼列表中的郵政編碼verizon fios可用性。BASH如果其他與引用文本

這個我的基礎工作,但比較從捲髮recived輸出到預期的輸出在if語句不起作用。

我知道有一個更好的方法來做到這一點,但我真的很感興趣這個方法有什麼問題。我認爲這與報價越來越混亂有關。

讓我知道你們的想法。我原本以爲這將是一個快速的小腳本。哈。感謝您的幫助

這是我到目前爲止有:

#!/bin/bash 

Avail='<link rel="canonical" href="http://fios.verizon.com/fios-plans.html#availability-msg" />' 
NotAvail='<link rel="canonical" href="http://fios.verizon.com/order-now.html#availability-msg" />' 

while read zip; do 
    chk=`curl -s -d "ref=GIa6uiuwP81j047HjKMHOwEyW4QJTYjG&PageID=page9765&AvailabilityZipCode=$zip" http://fios.verizon.com/availability_post4.php --Location | grep "availability-msg"` 
#echo $chk 

    if [ "$chk" = "$Avail" ] 
    then 
    fios=1 
    elif [ "$chk" = "$NotAvail" ] 
    then 
    fios=0 
    else 
    fios=err 
    fi 

echo "$zip | $fios" 

done < zipcodes.txt 
+0

你確定這是一個bash的問題?你用curl命令檢查了你實際收到的東西嗎?也許頁面已經改變。我在結果中找不到'$ Avail'和'$ NotAvail'的值。 – erik

+1

我可以證實@erik是正確的,'$ Avail'和'$ NotAvail'不會顯示在輸出中。鑑於'ref'參數,頁面可能非常動態。否則,您的腳本似乎捲曲並正確拉取郵編。 –

+0

I $ Avail和$ NotAvail是前幾行設置的變量。該部分是正確的。 –

回答

2

最有可能的,從curl讀取線CR/LF結束。 grep將採用LF作爲行結束,並將CR排在一行中,它不會與任何一種模式相匹配。 (其他的空白問題也可能導致類似的不可見的不匹配,但由於HTTP堅持它們,迷路CR是非常普遍的。)

最簡單的解決方案是使用不太明確的匹配,比如glob或正則表達式;這些都可用於bash的[[(而不是[)命令。

例如:

if [[ $chk =~ /fios-plans\.html ]]; then 

會做一個字符串比較

+0

謝謝。我曾想過空間和CR/LF,但你所說的一切都很有道理。我最終做了類似的使用剪切。你能否進一步解釋=〜操作符?再次感謝。 –

+0

@ user3381043:'=〜'匹配左側的字符串和右側的(posix擴展的)正則表達式。請參閱bash手冊本節中[[...]]的說明:http://www.gnu.org/software/bash/manual/bashref.html#Conditional-Constructs – rici

+0

如果有人正在尋找在谷歌地球verizon fios地圖,我已經完成,並張貼在這裏:http://thestevenexperience.com/2014/03/12/verizon-fios-availability-map-by-us-zipcode 再次感謝幫幫我。 –