Linux shell 图形化窗口编辑之dialog

01. 创建文本菜单示例

创建菜单布局

clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit menu\n\n"
echo -en "\t\tEnter option: "

# -en可以去掉末尾的换行符,这样等待输入,显得跟专业

创建菜单函数

function menu {
clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit program\n\n"
echo -en "\t\tEnter option: "
read -n 1 option
}

添加菜单逻辑

menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection";;
esac

整合shell脚本菜单

#!/bin/bash
# simple script menu
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function memusage {
clear
cat /proc/meminfo
}
function menu {
clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit program\n\n"
echo -en "\t\tEnter option: "
read -n 1 option
}

while [ 1 ]
do
menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection";;
esac

echo -en "\n\n\t\t\tHit any key to continue"
read -n 1 line
done
clear

使用select命令

select variable in list
do
commands
done

list参数是由空格分隔的文本选项列表,这些列表构成了整个菜单。 select命令会将每个列表项显示成一个带编号的选项,然后为选项显示一个由PS3环境变量定义的特殊提示符。

#!/bin/bash
# using select in the menu
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function memusage {
clear
cat /proc/meminfo
}

PS3="Enter option: "
select option in "Display disk space" "Display logged on users" "Display memory usage" "Exit program"
do
case $option in
"Exit program")
break ;;
"Display disk space")
diskspace ;;
"Display logged on users")
whoseon ;;
"Display memory usage")
memusage ;;
*)
clear
echo "Sorry, wrong selection";;
esac
done
clear

02. 制作图形窗口

dialog包最早是由Savio Lam创建的一个小巧的工具,现在由Thomas E. Dickey维护。该包能够用ANSI转义控制字符在文本环境中创建标准的窗口对话框。你可以轻而易举地将这些对话框融入自己的shell脚本中,借此与用户进行交互。

01. dialog 包

dialog命令使用命令行参数来决定生成哪种窗口部件(widget)

部 件 			描 述
----------------------------------------------------------------
calendar 		提供选择日期的日历
checklist 		显示多个选项(其中每个选项都能打开或关闭)
form 			构建一个带有标签以及文本字段(可以填写内容)的表单
fselect 		提供一个文件选择窗口来浏览选择文件
gauge 			显示完成的百分比进度条
infobox 		显示一条消息,但不用等待回应
inputbox 		提供一个输入文本用的文本表单
inputmenu 		提供一个可编辑的菜单
menu 			显示可选择的一系列选项
msgbox 			显示一条消息,并要求用户选择OK按钮
pause 			显示一个进度条来显示暂定期间的状态
passwordbox 	显示一个文本框,但会隐藏输入的文本
passwordform 	显示一个带标签和隐藏文本字段的表单
radiolist 		提供一组菜单选项,但只能选择其中一个
tailbox 		用tail命令在滚动窗口中显示文件的内容
tailboxbg 		跟tailbox一样,但是在后台模式中运行
textbox 		在滚动窗口中显示文件的内容
timebox 		提供一个选择小时、分钟和秒数的窗口
yesno 			提供一条带有Yes和No按钮的简单消息

要在命令行上指定某个特定的部件,需使用双破折线格式。

dialog --widget parameters

widget是部件名, parameters定义了部件窗口的大小以及部件需要的文本。每个dialog部件都提供了两种形式的输出:

  • 使用STDERR
  • 使用退出状态码

可以通过dialog命令的退出状态码来确定用户选择的按钮。如果选择了Yes或OK按钮,dialog命令会返回退出状态码0。如果选择了Cancel或No按钮,dialog命令会返回退出状态码1。可以用标准的$?变量来确定dialog部件中具体选择了哪个按钮。

如果部件返回了数据,比如菜单选择,那么dialog命令会将数据发送到STDERR。可以用标准的bash shell方法来将STDERR输出重定向到另一个文件或文件描述符中。

dialog --inputbox "Enter your age:" 10 20 2>age.txt

1. msgbox部件
msgbox部件是对话框中最常见的类型。它会在窗口中显示一条简单的消息,直到用户单击OK按钮后才消失。使用msgbox部件时要用下面的格式。

dialog --msgbox text height width

如果想在窗口顶部放一个标题,也可以用 --title参数,后接作为标题的文本。

dialog --title "Mr Zhao" --msgbox "我是一个大帅哥!" 10 25

Linux shell 图形化窗口编辑之dialog_第1张图片

2. yesno部件
yesno部件进一步扩展了msgbox部件的功能,允许用户对窗口中显示的问题选择yes或no。它会在窗口底部生成两个按钮:一个是Yes,一个是No。用户可以用鼠标、制表符键或者键盘方向键来切换按钮。要选择按钮的话,用户可以按下空格键或者回车键。

如果用户选择了No按钮,退出状态码是1;如果选择了Yes按钮,退出状态码就是0。

dialog --title "Please answer" --yesno "Is this thing on?" 10 25

echo $?
1

Linux shell 图形化窗口编辑之dialog_第2张图片
3. inputbox部件
inputbox部件为用户提供了一个简单的文本框区域来输入文本字符串。 dialog命令会将文本字符串的值发给STDERR。你必须重定向STDERR来获取用户输入。

inputbox提供了两个按钮: OK和Cancel。如果选择了OK按钮,命令的退出状态码就是0;反之,退出状态码就会是1。

dialog --inputbox "Enter your age:" 10 25 2>age.txt

echo $?
0

cat age.txt
12

Linux shell 图形化窗口编辑之dialog_第3张图片
4. textbox部件
textbox部件是在窗口中显示大量信息的极佳办法。它会生成一个滚动窗口来显示由参数所指定的文件中的文本。

dialog --textbox /etc/passwd 15 45

Linux shell 图形化窗口编辑之dialog_第4张图片
5. menu部件

dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2> test.txt

Linux shell 图形化窗口编辑之dialog_第5张图片
6. fselect部件
fselect部件在处理文件名时非常方便。不用强制用户键入文件名,你就可以用fselect部件来浏览文件的位置并选择文件。

fselect选项后的第一个参数是窗口中使用的起始目录位置。 fselect部件窗口由左侧的目录列表、右侧的文件列表。

dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt

Linux shell 图形化窗口编辑之dialog_第6张图片

02. dialog 选项

有许多其他的选项可以让你全面定制窗口外观和操作。

选 项 					描 述
--add-widget 			继续下个对话框,直到按下Esc或Cancel按钮
--aspect ratio 			指定窗口宽度和高度的宽高比
--backtitle title 		指定显示在屏幕顶部背景上的标题
--begin x y 			指定窗口左上角的起始位置
--cancel-label label 	指定Cancel按钮的替代标签
--clear 				用默认的对话背景色来清空屏幕内容
--colors 				在对话文本中嵌入ANSI色彩编码
--cr-wrap 				在对话文本中允许使用换行符并强制换行
--create-rc file 		将示例配置文件的内容复制到指定的file文件中(1)
--defaultno 			将yes/no对话框的默认答案设为No
--default-item string 	设定复选列表、表单或菜单对话中的默认项
--exit-label label 		指定Exit按钮的替代标签
--extra-button 			在OK按钮和Cancel按钮之间显示一个额外按钮
--extra-label label 	指定额外按钮的替代标签
--help 					显示dialog命令的帮助信息
--help-button 			在OK按钮和Cancel按钮后显示一个Help按钮
--help-label label 		指定Help按钮的替代标签
--help-status 			当选定Help按钮后,在帮助信息后写入多选列表、单选列表或表单信息
--ignore 				忽略dialog不能识别的选项
--input-fd fd 			指定STDIN之外的另一个文件描述符
--insecure 				在password部件中键入内容时显示星号
--item-help 			为多选列表、单选列表或菜单中的每个标号在屏幕的底部添加一个帮助栏
--keep-window 			不要清除屏幕上显示过的部件
--max-input size 		指定输入的最大字符串长度。默认为2048
--nocancel 				隐藏Cancel按钮
--no-collapse 			不要将对话文本中的制表符转换成空格
--no-kill 				将tailboxbg对话放到后台,并禁止该进程的SIGHUP信号
--no-label label 		为No按钮指定替代标签
--no-shadow 			不要显示对话窗口的阴影效果
--ok-label label 		指定OK按钮的替代标签
--output-fd fd 			指定除STDERR之外的另一个输出文件描述符
--print-maxsize 		将对话窗口的最大尺寸打印到输出中
--print-size 			将每个对话窗口的大小打印到输出中
--print-version 		将dialog的版本号打印到输出中
--separate-output 		一次一行地输出checklist部件的结果,不使用引号
--separator string 		指定用于分隔部件输出的字符串
--separate-widget string 	指定用于分隔部件输出的字符串
--shadow 				在每个窗口的右下角绘制阴影
--single-quoted 		需要时对多选列表的输出采用单引号
--sleep sec 			在处理完对话窗口之后延迟指定的秒数
--stderr 				将输出发送到STDERR(默认行为)
--stdout 				将输出发送到STDOUT
--tab-correct 			将制表符转换成空格
--tab-len n 			指定一个制表符占用的空格数(默认为8)
--timeout sec 			指定无用户输入时, sec秒后退出并返回错误代码
--title title 			指定对话窗口的标题
--trim 					从对话文本中删除前导空格和换行符
--visit-items 			修改对话窗口中制表符的停留位置,使其包括选项列表
--yes-label label 		为Yes按钮指定替代标签

1)dialog启动时会先去检查是否设置了DIALOGRC环境变量,该变量会保存配置文件名信息。如果未设置该变量或未找到该文件,它会将$HOME/.dialogrc作为配置文件。如果这个文件还不存在的话,就尝试查找编译时指定的GLOBALRC文件,也就是/etc/dialogrc。如果这个文件也不存在的话,就用编译时的默认值。

2)--backtitle选项是为脚本中的菜单创建公共标题的简便办法。如果你为每个对话窗口都指定了该选项,那么它在你的应用中就会保持一致,这样会让脚本看起来更专业。

03. 在脚本中使用 dialog 命令

在脚本中使用dialog命令不过就是动动手的事。你必须记住两件事:

  • 如果有Cancel或No按钮,检查dialog命令的退出状态码
  • 重定向STDERR来获得输出值

如果遵循了这两个规则,立刻就能够拥有具备专业范儿的交互式脚本,一个系统菜单示例。

#!/bin/bash
# using dialog to create a menu
temp=$(mktemp -t test.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)

function diskspace {
df -k > $temp
dialog --textbox $temp 20 50
}

function whoseon {
who > $temp
dialog --textbox $temp 20 50
}

function memusage {
cat /proc/meminfo > $temp
dialog --textbox $temp 20 50
}

while [ 1 ]
do
dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 0 "Exit" 2> $temp2

if [ $? -eq 1 ]
then
break
fi

# 获取用户选择的菜单选项,按分支执行
selection=$(cat $temp2)

case $selection in
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
0)
break ;;
*)
dialog --msgbox "Sorry, invalid selection" 10 30
esac

done

rm -f $temp 2> /dev/null
rm -f $temp2 2> /dev/null

Linux shell 图形化窗口编辑之dialog_第7张图片
Linux shell 图形化窗口编辑之dialog_第8张图片

你可能感兴趣的:(Linux)