2017-07-29 54 views
-2

我正在尋找一種在我的bash腳本中採取不同行爲的方式,具體取決於我的外部IP地址。更具體的說,如果我的外部IP地址是111.111.111.111然後做一些行動,否則做別的。在bash中測試grep輸出

這是我的代碼:

extIP=$(curl ifconfig.me | grep 111.111.111.111) 

if [ -? ${extIP} ] 
then 
    runExecutable 
else 
    echo "111.111.111.111 is not your IP." 
fi 

我不知道如何測試extIP

回答

1

只要運行卷曲/ grep命令的檢查退出狀態

curl ifconfig.me | grep -s 111.111.111.111 
if [ "$?" == "0" ] 
then 
    runExecutable 
else 
    echo "111.111.111.111 is not your IP." 
fi 
1

試試這個

echo 'Enter the IP Address you want to test' 
read IP_ADDRESS 
extIP=$(curl ifconfig.me | grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*') 

if [ "$IP_ADDRESS" == "$extIP" ] 
then 
    bash runExecutable.sh 
    exit 0 
fi 

echo '${IP_ADDRESS} is not your IP' 
exit 1 # if it's bad or just exit 0 otherwise 
+0

非常感謝您的回覆!我也很想理解grep和sed。當你運行grep -o命令時,'[0-9] * \。[0-9] * \。[0-9] * \。[0-9] *'是什麼意思?對不起,新問題 – hihihi

+0

嗨,一般'grep'正則表達式工作。實際上,'grep'代表[全局正則表達式打印](https://kb.iu.edu/d/abnd)。 '-o'代表_only matching_,這意味着它只顯示*正則表達式匹配的部分。 '[0-9] * \。[0-9] * \。[0-9] * \。[0-9] *''是一個正則表達式,用於捕獲xxx.xxx.xxx格式的數字。 xxx像IP地址一樣。它可以被優化爲只接受最多4位數字,但假設'ifconfig.me'只返回IP,那麼它可以安全使用。你可以學習更多關於正則表達式[這裏](https://regexone.com/)。 – juancab

1

您應該測試您的命令管道directly with if的退出代碼,就像這樣:

addr="111.111.111.111" 
if curl -s ifconfig.me | grep -qF "$addr"; then 
    runExecutable "$addr" ... 
else 
    echo "$addr is not your IP." 
fi 

此外,你可能想要沉默curl的進展ou輸入-sgrep的與-q的匹配,使用grep中的固定字符串搜索與-F,並將您的IP地址存儲在變量中,以便以後重複使用。

請注意,[實際上是一個shell命令,如果條件如下,則退出0;否則返回1if比使用退出代碼分支。

有關更多詳細信息,請參見this bash pitfall

+1

概念上這裏最好的答案恕我直言,但我認爲你需要一個空間之前';',我會認爲這是一個維護問題重複相同的IP地址兩次,並希望看到它被一個單一的變量在開始時只設置一次。好的方法雖然+1。 –

+0

@MarkSetchell,謝謝,關於變量/地址重用的好處。我編輯了我的答案。關於分號';' - 之前不需要空格,因爲';'是一個POSIX運算符(比如'''','&&'或'&'),而不是關鍵字。被認爲是grep模式的一部分,它應該逃脫。 – randomir

+1

我不知道,所以謝謝你讓我挺直 - 這很好學! –