2013-05-25 22 views
2

我需要創建一個使用選擇環路和案例指導,但不是echo命令在菜單項六種選擇一個選擇菜單,他們必須像這樣顯示:的Linux腳本選擇菜單

1) opt1 
2) opt2 
3) opt3 
4) opt4 
5) opt5 
6) opt6 

而且不喜歡:

1) opt1 3) opt3 5) opt5 
2) opt2 4) opt4 6) opt6 

到目前爲止我有此代碼,但問題是與顯示器,具有5個選項它垂直顯示,但與6它並排顯示側:

#! /bin/sh 
PS3="Enter your choice :" 
select choice in "opt1" "opt2" "opt3" "opt4" "opt5" "Exit"; do 
case $REPLY in 
    1) echo "$choice";; 
    2) echo "$choice";; 
    3) echo "$choice";; 
    4) echo "$choice";; 
    5) echo "$choice";; 
    6) echo "see you next time";break;; 
    *) echo "Wrong choice!";; 
esac 
done 
+1

您可能會在這裏找到一些解決方案:http://askubuntu.com/questions/1705/how-can-i-create-a-select-menu-in-a-shell-script – ayaz

+1

關於ubuntu 12.04系統我在,/ bin/sh是符號鏈接,甚至沒有選擇命令。使用bash,選擇菜單顯示在一列中。你在用什麼外殼/發行版? –

+0

我在Linux CentOS 6.3上,我正在使用終端bash – user2420374

回答

2

嘗試這樣:

menu() 
{ 
    cat <<EOF 
    1) opt1 
    2) opt2 
    3) opt3 
    4) opt4 
    5) opt5 
    6) opt6 
    q) quit 
EOF 

    echo -n "make your choice > <^H^H" 
    read -n 1 foo 
    echo 

    case "$foo" in 
     1|opt1) echo "opt1" ;; 
     2|opt2) echo "opt2" ;; 
     3|opt3) echo "opt3" ;; 
     4|opt4) echo "opt4" ;; 
     5|opt5) echo "opt5" ;; 
     6|opt6) echo "opt6" ;; 
     q|quit) echo "bye bye!" ;; 
    esac 
} 

^H的立場爲ASCII碼序列0x08BS(退格鍵)。

(在Vim中你可以用CTRL+v輸入這個,然後CTRL+h

0

可以使用select內置的,如果有的話:

#!/bin/bash 

select o in opt{1..6}; do 
    case "${o}" in 
     opt[1-6]) 
      break 
      ;; 
     *) 
      echo "Invalid choice '${REPLY}', please pick one of the above" 
      ;; 
    esac 
done 
echo "You picked: ${o}" 

實例運行:

$ ./t.sh 
1) opt1 
2) opt2 
3) opt3 
4) opt4 
5) opt5 
6) opt6 
#? 9 
Invalid choice '9', please pick one of the above 
#? asdf 
Invalid choice 'asdf', please pick one of the above 
#? 1 
You picked: opt1 
2

我我遇到了同樣的問題。我不明白select究竟是如何使用LINES和COLUMNS的(請參閱bash手冊頁中的「Shell Variables」),但將COLUMNS設置爲1(確實值很小)幫助了我。

+0

我曾經遇到過的最好的解釋是Mark G. Sobell在他的書中,http://books.google.com/books?id=k9bHSd97HzMC&pg=PA984&lpg=PA984&ots=A7SPsvjCkx – syntaxerror

4

調整COLUMNS變量有助於限制菜單中的列數。我通常做(在腳本中):

COLUMNS=1 
select ... 

時,我想一列所有的時間。

準確地說,COLUMNS = 1意味着你的TERMINAL是一個字符寬。選擇命令然後別無選擇,只能打印ONE COLUMN的菜單項。

要真正準確的,你可以

  1. 發現的最長項的長度(itemLen)
  2. 十尋找項目和MOD的數量得到的數字的最大數(numberLen)
  3. COLUMNS =((itemLen + numberLen = 2))

其中 '2' 是用於菜單項數和項之間的括號和空間。但這不是必要的。