2011-10-28 150 views
2

我是bash shell腳本編程的新手,這是我第一次和第一次在這裏發佈一個問題在stackoverflow。我已經搜索了檔案無濟於事。我希望有一個人可以幫助我。對陣列中的每個元素測試一個字符串

我有這樣

 
declare -a SID=("mydb1" "mydb2" "mydb3") 

在我的劇本陣列,用戶將被提示輸入一個字符串,它會被存儲在$DBNAME變量。

例如,用戶輸入「mydb2」(不含引號),這將存儲在$DBNAME變量中。

我想創建一個循環,並且我想要對用戶的輸入進行測試,以針對${SID[@]}變量的每個元素。

當找到匹配項時,它將退出循環並繼續執行腳本中的下一個命令。

請幫我創建一個腳本來匹配字符串值與數組變量的每個元素。

任何幫助將不勝感激。謝謝!

+0

當找到匹配項時,您希望發生什麼?你只測試一場比賽嗎?或者你關心哪一個匹配? – Flimzy

+0

嗨,馬克感謝您的關心。是的,我想測試用戶的輸入,它應該與其中一個元素匹配。 – Junior

回答

1

如果你想要做的是檢查用戶輸入的有效DBNAME,做到這一點:

declare -a SID=("mydb1" "mydb2" "mydb3") 
case " ${SID[*]} " in 
    *\ $DBNAME\ *) 
     echo Entered a correct DB name! Good job, pal! 
     ;; 
    *) 
     echo Try again 
     ;; 
esac 

這可能導致案件誤報,你允許包含空格的用戶輸入。如果這是一個問題,您可以通過使用用戶輸入中不允許的非空格分隔符來解決問題。例如:

case ".mydb1.mydb2.mydb3." in 
    *.$DBNAME.*) 

如果用戶輸入是完全開放式的,未經驗證的和,然後一個for循環可能是你最好的選擇,如@ glennjackson的答案解釋。

+0

我真的很感激。謝謝! 如何在循環中未明確聲明數組值?像這樣的東西,但這個不起作用。 read -p輸入數據庫名稱:DBNAME for DB in「$ {SID [@]}」 do if [[DB!= DBNAME]];然後 printf的「比賽未找到\ n」個 其他 printf「上找到匹配\ n」個 網絡 做 – Junior

+0

for循環,你認爲你可以使用,但是這是混亂,如果所有你關心的是找到一個匹配,因爲你必須保留一個臨時變量,當您找到匹配項時將其設置爲true,然後在循環後檢查該變量以查看是否找到匹配項。 – Flimzy

+0

Flimzy和Mark非常感謝你。有效!像你這樣的人激勵像我這樣的新手追求我們的目標,學習更多。對此,我真的非常感激。與此同時,我將瀏覽檔案並嘗試讓自己沉浸在系統中。 :) – Junior

0

如果你想要的是檢查$ DBNAME是一個條目是$ SID,最容易做的事情大概是:

 
if echo ${SID[@]} | grep -wq "$DBNAME"; then 
    # DBNAME is in SID array 
fi 

注意,-w和-q是非標準選項給grep ,所以你可能會想:

 
if echo ${SID[@]} | grep "\<$DBNAME\>" > /dev/null; then 
    # DBNAME is in SID array 
fi 

如果任何SID條目包含空格,這將失敗,並 其他奇怪的字符無疑會帶來問題。

+0

即使在SID中的條目中不包含空格,這也會返回誤報,例如。如果用戶輸入「mydb1 mydb2」 –

+0

感謝所有的輸入。 – Junior

+0

跟進此問題。我做了進一步的研究,我相信它應該是: if echo $ {SID [@]} | grep -o「$ DBNAME」;然後 回聲「找到匹配」 fi 不確定。 :-) grep -wq「$ DBNAME」和grep「\ <$DBNAME\>」對我不起作用。 再次感謝所有的貢獻! – Junior

5

@ Flimzy的方法很好。使用for循環的正確方法是

for db in "${SID[@]}"; do 
    if [[ $db = $DBNAME ]]; then 
    echo yes 
    break 
    fi 
done 
+0

+1,因爲這個答案是按照預期工作的......另一方面,我會在這裏提到弗裏姆茲的答案(因爲我對他的問題的評論被埋在了一長串評論的末尾)。弗利姆西的答案可以給出誤報,例如。 「mydb1 mydb2」 –

相關問題