2016-01-14 31 views
-1

我遇到了打印出數組的索引和項目的腳本的問題,然後允許用戶輸入將打印出數組的特定項目的索引。bash - 通過索引從數組中拉出內容

array=(abc def ghi) 

i=0 
while [ $i -lt ${#array[*]} ]; do 
    echo "[$i] ${array[$i]}" 
    i=$(($i+1)); 
done 

echo -e "select an index: "; read answer 

#this is the part that is troubling me 

for index in ${!array[*]}; do 
    if [[ $answer == $index ]]; then 
     echo ${array[$index]} 
     break 
    else 
     echo "invalid" 
     break 
    fi 
done 

所以如果用戶輸入0,它應該打印abc。 1將高清等,目前僅適用於索引0

+0

什麼你要找的是'回聲 「$ {數組[答案]}」' –

+0

請看看:HTTP:// WWW。 shellcheck.net/ – Cyrus

+0

添加缺少的引用...不得不重新鍵入它,因爲該腳本是在另一個設備 – user3308568

回答

0

在有問題,我可以找到情侶:

  1. 你需要$項之後有一空格來]
  2. 分離$ item可能應該是$ index
  3. 最重要的是,在「echo invalid」之後刪除中斷,這是循環在測試「0」後立即退出並且不檢查下一個數組索引的原因。使用一個標誌,那麼你應該控制答案是否與任何有效索引匹配,否則打印「無效」消息。爲了清楚起見,我在那裏使用了非常明確的字符串測試

正在運行的代碼應該如下:

array=(abc def ghi) 
i=0 
while [ $i -lt ${#array[*]} ]; do 
    echo "[$i] ${array[$i]}" 
    i=$(($i+1)); 
done 
echo -e "select an index: "; read answer 

for index in ${!array[*]}; do 
    found="FALSE" 
    if [[ "$answer" == "$index" ]]; then 
     found="TRUE" 
     echo "${array[$index]}" 
     break 
    fi 
done 

if [ "$found" == "FALSE" ]; then 
    echo "Invalid input $answer" 
fi 
+0

道歉的語法差...但這似乎是伎倆。謝謝! – user3308568

+0

不用擔心。我認爲邏輯中的真正問題是'else'分支處的中斷,因爲在這種情況下,基本上不會繼續測試除第一個以外的索引值。 – sal