2011-02-13 73 views
1

嗨,首先感謝所有那些給予有幫助的答案/指針!Bash shell腳本提示用戶輸入(CLI GUI)對話框

我正在寫一個Bash腳本,有時可能需要詢問用戶輸入。我正在尋找一種工具來在運行級別3(無X Windows)上提供一個輸入框(假設GUI彈出消息框),該工具提供了用於手動輸入的選擇列表和選項。它應該在每個選項旁邊提供一個單選按鈕。

例如,如果它被要求一個名稱的用戶將出現一個列表這樣


(*)約翰尼

()奔

()希拉里。

()<manual input>


<manual input>線將是一個文本框,以允許用戶輸入自由文本。 輸出應該是標準輸出,應該是例如「希拉里」。

總之,要求是:

1)應該彈出,是一個明亮的色彩抓住用戶的注意力。平面文本不適合

2)優選地允許選擇使用光標或鼠標

3)提供一個單選按鈕選擇列表

4)還允許自由文本輸入

5)寫選擇到標準輸出

6)我不想擦拭狀態/在屏幕上已經日誌消息

Bash的閱讀命令不夠「華而不實」,它不會引起用戶的注意。

工具dialog擦除屏幕上的文本,因爲它重新繪製整個屏幕,並且不允許在一個屏幕中顯示選擇列表和自由文本輸入框。

再次感謝

MC

回答

2

爲sugested上面的對話框的命令將工作

創建--keep-磷灰石一個對話框,讓您的屏幕輸入後,用--checklist使其更多鈔票有無線電選擇框。 將所有答案放入一個數組中,並使每個數組項都有一個while循環。

$ {#arrayName中[@]} - >中的選擇 $陣列或數量的項目數{arrayName中[@]} - >輸出所有數組項

#!/bin/bash 

result() { 
i=0 
echo there are ${#arrayName[@]} options selected 
while ((i < ${#arrayName[@]})) 
do 
    echo $i ${arrayName[$i]} 
    i=$(($i + 1)) 
done 
} 

cmd=(dialog --separate-output --keep-tite --checklist "Select options:" 22 76 4) 
options=(1 "Johnny" off 
     2 "Ben" off 
     3 "Hillary" off 
     4 "User Input" off 
) 

choice=$("${cmd[@]}" "${options[@]}" 2>&1 > /dev/tty) 

for answer in $choice 
do 
# make decsion 
case $answer in 
    1) 
     arrayNum=${#arrayName[@]} # arrayNum is the amount of items in arrayName 
     arrayName[$arrayNum]="Johnny" # if selected put Johnny in arrayName 
     ;; 
    2) 
     arrayNum=${#arrayName[@]} # If johnny is selected ${#arrayName[@]} outputs 1 if not selected 0 
     arrayName[$arrayNum]="Ben" # If selected add to array 
     ;; 
    3) 
     arrayNum=${#arrayName[@]} 
     arrayName[$arrayNum]="Hillary" 
     ;; 
    4) # If User Input is selected create an new dialog inputbox 

    user_input=$(\ 
    dialog --keep-tite --title "Enter Your Name" \ 
     --inputbox "Enter name:" 8 40 \ 
    3>&1 1>&2 2>&3 3>&- \ 
    ) 
     arrayNum=${#arrayName[@]} 
     arrayName[$arrayNum]="$user_input" 
     ;; 
esac 
done 
result 
+0

請解釋您的答案,只包含代碼的答案不適合堆棧溢出... – ShellFish 2015-06-18 23:47:43

0

我能想到的3種方式。 YMMV

  • 使用Zenity(可能因爲您沒有X而被取消資格)。
  • 使用dialog - 至於屏幕上的東西消失,完整地使用對話框來構建您的腳本,甚至在窗口小部件中呈現信息文本。它還有一個--stdout選項,用於將其輸出導向標準輸出以保持輸出。 Whiptail是我認爲較輕的對話替代品。
  • 使用tput並手動移動光標,繪製顏色等,使您的對話框突出。這是乏味和容易出錯的。

我不喜歡鮮豔的顏色和東西,尤其是對於正常的選擇。我更喜歡一個柔和的read。但是,如果你想這樣做,我會推薦第二種方法。您的應用程序應該使用小部件工具包或不使用它。不要試圖做到這一點。這是不值得的麻煩。

+1

打火機?也許不會 - 如對話框[手冊]中所述(http://invisible-island.net/dialog/manpage/dialog.html#h3-WHTATAIL)。 – 2015-04-18 17:38:20