2011-02-13 165 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