2015-05-22 16 views
-3

我想用多選的腳本創建菜單。 喜歡:在腳本外殼中選擇多個選項?

1) 

2) 

3) 

4) 

5) 

我可以在相同的時間選擇1和3,和5。

+0

用戶如何進入他的選擇? '1 [ENTER] 3 [ENTER] 5 [ENTER]運行[ENTER]或[1,3,5 [ENTER]'?解析他的迴應並調用正確的功能。 –

+0

用戶可以這樣輸入他的選擇:1,2,3 [ENTER] –

+1

爲了回答以及未來讀者的好處:如果答案解決了您的問題,請點擊旁邊的大複選標記以接受它。它;如果您找到答案_helpful_,請點擊向上箭頭圖標(您可以同時執行這兩個操作),然後點擊投票。請參閱[相關幫助中心文章](http://stackoverflow.com/help/someone-answers)。如果您的問題尚未得到充分解答,請提供反饋。 – mklement0

回答

4

bashselect複合命令不直接支持多種選擇,但你仍然可以基地您的IT解決方案,採取的,無論用戶輸入被記錄在特殊$REPLY變量的事實優勢:

#!/usr/bin/env bash 

choices=('one' 'two' 'three' 'four' 'five') # sample choices 
select dummy in "${choices[@]}"; do # present numbered choices to user 
    # Parse ,-separated numbers entered into an array. 
    # Variable $REPLY contains whatever the user entered. 
    IFS=', ' read -ra selChoices <<<"$REPLY" 
    # Loop over all numbers entered. 
    for choice in "${selChoices[@]}"; do 
    # Validate the number entered. 
    ((choice >= 1 && choice <= ${#choices[@]})) || { echo "Invalid choice: $choice. Try again." >&2; continue 2; } 
    # If valid, echo the choice and its number. 
    echo "Choice #$((++i)): ${choices[choice-1]} ($choice)" 
    done 
    # All choices are valid, exit the prompt. 
    break 
done 

echo "Done." 

至於如何select命令正常作品,具有選擇:

  • 運行man bash並在標題爲「複合命令」
  • 尋找一個註解的示例,請參見this answer

答案實現定製邏輯如下:

  • select命令,dummy的指定的目標變量,將被忽略,並且$REPLY變量來代替,因爲擊設置它無論用戶輸入什麼(未驗證)。
  • IFS=', ' read -ra selChoices <<<"$REPLY"標記化的用戶輸入的值:
    • 它通過一個here-string<<<)進料至使用逗號和空間(,<space>)作爲[內部]字段分隔符的實例的read命令
    • IFS=...
      • 請注意,作爲副作用,用戶可以使用空格來分隔他們的選擇。
    • 並將得到的標記存儲爲數組的元素(-aselChoices; -r只是關閉\字符的解釋。在輸入
    • for choice in "${selChoices[@]}"; do在所有令牌上循環,即用戶選擇的單個號碼。
    • ((choice >= 1 && choice <= ${#choices[@]})) || { echo "Invalid choice: $choice. Try again." >&2; continue 2; }確保每個令牌都是有效的,即它是介於1和所呈現的選擇計數之間的數字。使用arithmetic expansion$((...))
  • echo "Choice #$((++i)): ${choices[choice-1]} ($choice)"輸出每個選擇和選擇號碼
    • 與正在運行的索引(i),其遞增(++i)前綴 - 因爲在算術上下文的可變默認爲0 ,第一個指數產出將是1;
    • 後面跟着${choices[choice-1]},即由輸入的數字表示的選擇串,遞減1,因爲Bash陣列是基於0的;請注意0​​在數組下標中不需要$前綴,因爲在算術上下文中評估下標(就像在$((...))內部一樣),如上所述。
    • 終止於($choice),括號內爲選定的數字。
  • break需要退出提示;默認情況下,select將繼續提示。
+0

其工作非常感謝你,但我想了解你是如何做到的? 並再次感謝你;) –

+0

@zakariagatter:我的榮幸;看到我的更新。 – mklement0