2014-03-28 42 views
3

例如bash的選擇菜單獲得指數

#!/bin/bash 

INSTALL_PATH="/usr/local" 
BFGMINER_INSTALL_PATH="${INSTALL_PATH}/bfgminer" 
BFGMINER_REPO="https://github.com/luke-jr/bfgminer.git" 

list_last_ten_bfgminer_tags() { 
    cd ${BFGMINER_INSTALL_PATH} 
    git for-each-ref --format="%(refname)" --sort=-taggerdate --count=10 refs/tags | cut -c 6- 
} 

clone_bfgminer() { 
    cd ${INSTALL_PATH} 
    git clone ${BFGMINER_REPO} ${BFGMINER_INSTALL_PATH} 
} 

echo "select number to switch tag or n to continue" 
select result in master $(list_last_ten_bfgminer_tags) 
do 

    # HOW DO I CHECK THE INDEX??????? <================================= QUESTION 
    if [[ ${result} == [0-9] && ${result} < 11 && ${result} > 0 ]] 
     then 
      echo "switching to tag ${result}" 
      cd ${BFGMINER_INSTALL_PATH} 
      git checkout ${result} 
    else 
     echo "continue installing master" 
    fi 

    break 
done 

因此,如果用戶輸入1,case語句檢查比賽上的文字,我怎麼能匹配1呢?

+0

相關的和非常有用:http://stackoverflow.com/a/226724/1983854 – fedorqui

+0

@fedorqui謝謝,我已經看到了這一點之前,是一個偉大的職位,我想看看我是否能訪問按索引 –

+0

bash選擇數組我不明白你的問題,如果價值被返回,你怎麼知道哪個答案被選中?你通常想要的是價值而不是索引,這是'select'的全部方便。 –

回答

5

你並不需要檢查選擇了哪個值;你可以簡單地使用它。 做的唯一事情想檢查的是master,這很容易做到。

select result in master $(list_last_ten_bfgminer_tags) 
do 
    if [[ $result = master ]]; then 
     echo "continue installing master" 
    elif [[ -z "$result" ]]; then 
     continue 
    else 
     echo "switching to tag ${result}" 
     cd ${BFGMINER_INSTALL_PATH} 
     git checkout ${result} 
    fi 
    break 
done 
+0

沒錯,就是這樣。 –

+0

不,我得到這個,但是他們胖手指,並進入23,這不是一個選項,我該如何處理? –

+1

你沒有; 'select'爲你處理。如果你輸入'23',並且沒有選項23,'select'會讓你在進入主體之前輸入另一個選項。如果*有*選擇23,那麼,您的代碼如何假設區分有意選擇和錯字? – chepner

4

我很努力地理解你的問題,但這裏是一些示例代碼;該陣列可以動態填充,我猜你是從哪裏來的:

$ cat t.sh 
#!/bin/bash 

foo=(one two three four) 

echo "Please select an option: " 
select reply in "${foo[@]}"; do 
     [ -n "${reply}" ] && break 
done 
echo "You selected: ${reply}" 

$ ./t.sh 
Please select an option: 
1) one 
2) two 
3) three 
4) four 
#? 5 
#? 100 
#? 2 
You selected: two 

這是怎麼回事?

當然,如果您希望輸出/邏輯與select提供的輸出/邏輯不同,您也可以使用read並自行構建功能。

+0

用更多代碼更新了我的問題,這是否會更改您的答案? –

+0

不是,我仍然不明白你爲什麼要/需要索引。你的值是git標籤,你想對這些標籤做些什麼,選擇索引如何相關?正如我演示的那樣,如果沒有選擇答案,select所設置的變量將爲空,所以如果輸入了無效值或者只是按下回車鍵,您將繼續安裝主工作流程。您不需要手動檢查'$ result'是否在範圍內。 –

+0

表示用戶輸入30,沒有標籤,我想輸出一條消息,如果用戶不想切換標籤,我認爲通過索引驗證我可以更好地控制流量。另外,當我更改爲另一個回購時,它可能沒有標籤和/或標籤將以不同的名稱命名 –

9

使用$REPLY變量

PS3="Select what you want>" 
select answer in "aaa" "bbb" "ccc" "exit program" 
do 
case "$REPLY" in 
    1) echo "1" ; break;; 
    2) echo "2" ; break;; 
    3) echo "3" ; break;; 
    4) exit ;; 
esac 
done 
+1

+1這絕對回答他們的問題,但OP是以一種非慣用的方式做到這一點,所以我建議不要這樣做,這是沒有必要的。 –

+1

@AdrianFrühwirth老實說,我只有這個問題的標題和最後的情景。 ;)所以,你可能是對的。 ;) – jm666

+0

哈哈,夠公平的:-) –