一般基于Shell的脚步交互看起来都不是很友好,有一个库:dialog可以帮我们解决这个问题,它能在文本环境中用ANSI转义控制字符来创建标准的窗口对话框,有的Linux发行版系统没有安装,可以直接执行sudo apt-get install dialog安装即可。目前,dialog包支持如下窗口部件(widget):
calender | 提供选择日期的日历 |
checklist | 显示多个选项(其中每个选项都能打开或关闭) |
from | 构建一个表单(用标签和文本字段来填充) |
fselect | 提供一个文件选择窗口来浏览选择文件 |
gauge | 显示完成的百分比进度条 |
infoBox | 显示一条消息,但不用等待回应 |
inputBox | 提供一个输入文本用的文本菜单 |
inputmenu | 提供一个可编辑的菜单 |
menu | 显示可选择的一系列选项 |
msgBox | 显示一条消息,并要求用户选择OK按钮 |
pause | 显示一个进度条来显示特定暂定时间的状态 |
passwordBox | 显示一个文本框来输入文本,但会隐藏输入的文本 |
passwordform | 显示一个带标签和隐藏文本输入的菜单 |
radiolist | 提供一组菜单选项,但只能选择其中一个 |
tailBox | 用tail命令在滚动窗口中显示文件的内容 |
tailBoxbg | 与tailBox一样,但是在后台模式中运行 |
textBox | 在滚动窗口中显示文件的内容 |
timeBox | 提供一个选择小时、分钟和秒数的窗口 |
yesno | 提供一条简单的带yes和no按钮的消息 |
每个部件都提供两种格式的输出:
1. 使用STDERR
2. 使用退出状态码,它决定了用户选择的按钮,如选择了YES或OK按钮,dialog命令会返回退出状态码0,如选择了Cancle或NO按钮,则返回1,我们可以在下一条命令使用$?变量来查看dialog部件种具体用户选择了哪个按钮。另外,如果部件返回了用户输入的数据,dialog命令会将数据发送到STDERR,当然,可以重定向到文件,然后提供后面命令从文件中读取: dialog --inputBox "Enter you choice:" 10 202>input.txt
实例演示
- #!/bin/bash
- # A shell script for manage MysqL server
- # Author: LinJK
- # Date: 10/15/2017
- temp1=`mktemp -t tmp.XXXXXX`
- temp_result=`mktemp -t tmp_re.XXXXXX`
- db_user=xxxx
- db_port=xxxx
- db_host=xxxx
- date_now=$(date +%Y%m%d%H%M)
- function get_MysqL_pwd {
- dialog --insecure --passwordBox "Enter MysqL password:" 10 30 2> $temp_result
- }
- function get_MysqL_dbs {
- MysqL -u${db_user} -P${db_port} -p${db_pwd} -h${db_host} -e "show databases;" > $temp_result
- }
- function show_all_databases {
- get_MysqL_pwd
- db_pwd=`cat $temp_result`
- get_MysqL_dbs
- if [ $? -eq 1 ]
- then
- dialog --msgBox "Error password" 10 30
- else
- sed -n '2,$p' $temp_result > $temp1
- dialog --title `sed -n 1p $temp_result` --textBox $temp1 20 60
- fi
- }
- function dump_selected_database {
- get_MysqL_pwd
- db_pwd=`cat $temp_result`
- get_MysqL_dbs
- sed -n '2,$p' $temp_result > $temp1
- checklist_cmd=""
- while read line
- do
- checklist_cmd=$checklist_cmd" "$line" "$line" "$line
- done < $temp1
- # selected db to dump
- dialog --checklist "Databases" 20 60 10 $checklist_cmd 2> $temp1
- arr_sel=`cat $temp1`
- OLD_IFS="$IFS"
- IFS=" "
- arr=($arr_sel)
- IFS="$OLD_IFS"
- for db_name in ${arr[@]}
- do
- MysqLdump -u${db_user} -P${db_port} -p${db_pwd} -h${db_host} --hex-blob --single-transaction -B ${db_name}|gzip > ./${db_name}_${date_now}.sql.gz
- done
- }
- while [ 1 ]
- do
- dialog --menu "MysqL Management - LinJK_Ali" 20 50 10 \
- 1 "Show all databases" \
- 2 "Dump selected database" \
- 0 "Exit" \
- 2> $temp1
- if [ $? -eq 1 ]
- then
- break
- fi
- selection=`cat $temp1`
- case $selection in
- 1)
- show_all_databases
- ;;
- 2)
- dump_selected_database
- ;;
- 0)
- dialog --title "Tips" --yesno "Sure to exit?" 10 30
- if [ $? -eq 0 ]
- then
- break
- fi
- ;;
- *)
- dialog --title "Error" --msgBox "Invalid selection." 10 30
- esac
- done
- rm -rf $temp1 2> /dev/null
- rm -rf $temp_result 2> /dev/null
这里为了简单,就不具体管理数据库了,就显示磁盘信息吧,后面再完善( 2017-10-15 10:03:28完善,可以正常备份、查看数据库)。运行效果如下:
首页:
光标现在在选项1,我们按回车键选择(也可以鼠标点击选择)后,窗口如下:
使用流程就这样,很简单上手,要了解更多,执行"man dialog"了解详细参数情况。