2015-08-29 105 views
1

我正在搜索交互式地在bash中詢問一個電子郵件地址,直到它得到一個有效的電子郵件地址。這是代碼。bash正則表達式電子郵件

#!/bin/bash 
email="" 
email_status=[ "$email" =~ ^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$ ] 
while [ $email_status ] 
do 
    read -p "Enter admin email: " email 
    echo 
    if [[ "$email" =~ ^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$ ]] 
    then 
     echo "Email address $email is valid." 
    else 
     echo "Email address $email is invalid." 
    fi 
done 

我不明白爲什麼不工作。

回答

3

主要問題在於您似乎要爲while循環的初始條件設置條件的部分。我們可以只是退出循環所需的條件包括,簡化整個循環:

#!/bin/bash 

while true 
do 
    read -p "Enter admin email: " email 
    echo 
    if [[ "$email" =~ ^[a-zA-Z0-9._%+-][email protected][a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]] 
    then 
     echo "Email address $email is valid." 
     break 
    else 
     echo "Email address $email is invalid." 
    fi 
done 

這也是我修改,以接受小寫字符。

那麼爲什麼最初的版本你沒有工作?對於初學者來說,你並沒有真正執行你想要的命令。該命令將首先被分析,其中=分配會發生,就像您正在分配本地shell變量以執行其餘命令一樣。因此,在這種情況下,您將[指定爲email_status,然後嘗試執行"$email" =~ ^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$ ],這不是真正的命令。

即使是這樣,你的任務仍然不能工作,因爲你實際上一直想要的(除了使用[[,所以你可以使用正則表達式語法)就是做這個測試,然後將退出代碼存儲在exit_status喜歡:

[[ "$email" =~ ^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$ ]] 
email_status=$? 

,然後確保你的循環,你的最初版本沒有做內更新email_status。

+0

非常感謝!我不能給你投票,因爲我沒有達到15分,我會在我到達時做!謝謝 – FedeKrum