在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

实例演示

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

#!/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"了解详细参数情况。

原文链接:https://www.f2er.com/bash/390127.html

猜你在找的Bash相关文章