在Shell脚本中使用窗口

前端之家收集整理的这篇文章主要介绍了在Shell脚本中使用窗口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一般基于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按钮的消息
使用指定窗口部件很简单,只需在dialog命令加参数--跟部件名称即可: dialog --{widget_name} {widget_parameters}

每个部件都提供两种格式的输出

1. 使用STDERR

2. 使用退出状态码,它决定了用户选择的按钮,如选择了YES或OK按钮,dialog命令会返回退出状态码0,如选择了Cancle或NO按钮,则返回1,我们可以在下一条命令使用$?变量来查看dialog部件种具体用户选择了哪个按钮。另外,如果部件返回了用户输入的数据,dialog命令会将数据发送到STDERR,当然,可以重定向文件,然后提供后面命令从文件中读取: dialog --inputBox "Enter you choice:" 10 202>input.txt

实例演示

下面用一个简单的数据库管理功能的脚本来演示:

  1. #!/bin/bash
  2. # A shell script for manage MysqL server
  3. # Author: LinJK
  4. # Date: 10/15/2017
  5.  
  6. temp1=`mktemp -t tmp.XXXXXX`
  7. temp_result=`mktemp -t tmp_re.XXXXXX`
  8.  
  9. db_user=xxxx
  10. db_port=xxxx
  11. db_host=xxxx
  12.  
  13. date_now=$(date +%Y%m%d%H%M)
  14.  
  15. function get_MysqL_pwd {
  16. dialog --insecure --passwordBox "Enter MysqL password:" 10 30 2> $temp_result
  17. }
  18.  
  19. function get_MysqL_dbs {
  20. MysqL -u${db_user} -P${db_port} -p${db_pwd} -h${db_host} -e "show databases;" > $temp_result
  21. }
  22.  
  23. function show_all_databases {
  24. get_MysqL_pwd
  25. db_pwd=`cat $temp_result`
  26. get_MysqL_dbs
  27. if [ $? -eq 1 ]
  28. then
  29. dialog --msgBox "Error password" 10 30
  30. else
  31. sed -n '2,$p' $temp_result > $temp1
  32. dialog --title `sed -n 1p $temp_result` --textBox $temp1 20 60
  33. fi
  34. }
  35.  
  36. function dump_selected_database {
  37. get_MysqL_pwd
  38. db_pwd=`cat $temp_result`
  39. get_MysqL_dbs
  40. sed -n '2,$p' $temp_result > $temp1
  41. checklist_cmd=""
  42.  
  43. while read line
  44. do
  45. checklist_cmd=$checklist_cmd" "$line" "$line" "$line
  46. done < $temp1
  47.  
  48. # selected db to dump
  49. dialog --checklist "Databases" 20 60 10 $checklist_cmd 2> $temp1
  50. arr_sel=`cat $temp1`
  51. OLD_IFS="$IFS"
  52. IFS=" "
  53. arr=($arr_sel)
  54. IFS="$OLD_IFS"
  55. for db_name in ${arr[@]}
  56. do
  57. 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
  58. done
  59. }
  60.  
  61. while [ 1 ]
  62. do
  63. dialog --menu "MysqL Management - LinJK_Ali" 20 50 10 \
  64. 1 "Show all databases" \
  65. 2 "Dump selected database" \
  66. 0 "Exit" \
  67. 2> $temp1
  68.  
  69. if [ $? -eq 1 ]
  70. then
  71. break
  72. fi
  73.  
  74. selection=`cat $temp1`
  75.  
  76. case $selection in
  77. 1)
  78. show_all_databases
  79. ;;
  80. 2)
  81. dump_selected_database
  82. ;;
  83. 0)
  84. dialog --title "Tips" --yesno "Sure to exit?" 10 30
  85. if [ $? -eq 0 ]
  86. then
  87. break
  88. fi
  89. ;;
  90. *)
  91. dialog --title "Error" --msgBox "Invalid selection." 10 30
  92. esac
  93. done
  94.  
  95. rm -rf $temp1 2> /dev/null
  96. rm -rf $temp_result 2> /dev/null


这里为了简单,就不具体管理数据库了,就显示磁盘信息吧,后面再完善( 2017-10-15 10:03:28完善,可以正常备份、查看数据库)。运行效果如下:

首页:

光标现在在选项1,我们按回车键选择(也可以鼠标点击选择)后,窗口如下:

使用流程就这样,很简单上手,要了解更多,执行"man dialog"了解详细参数情况。

猜你在找的Bash相关文章