首页 运维 网络学院 查看内容

编写包含图形界面的shell脚本:Zenity介绍

2008-10-28 10:49 869 0

摘要:  Linux作为桌面系统正在越来越多的受人关注。为了改善用户体验,很多的程序员付出了大量的努力,不只是为了让普通用户得到更容易从Windows上迁移到Linux上,同时也为传统的系统管理员提...
关键词: nbsp Zenity 一个 password text 输入 title 用户 input 对话框

 Linux作为桌面系统正在越来越多的受人关注。为了改善用户体验,很多的程序员付出了大量的努力,不只是为了让普通用户得到更容易从Windows上迁移到Linux上,同时也为传统的系统管理员提供了更多的方便。     系统管理员通常需要在命令行上完成两类任务:批处理任务和交互式任务。相信熟悉shell编程的朋友都不会对前一种方式感到陌生。对于后一种方式,如何能够提供命令的执行效率,让交互更方便和顺畅是最重要的。随之产生的就是一些基于对话的交互方式,比如dialog命令:      dialog --menu TestDialog 0 0 5 1 Menuitem1 2 Menuitem2     可以产生如下的对话框: 图1     通过这些简单的基于文本的对话框,我们获得了与程序基本的交互的能力。当图形界面被引入之后,我们有了各种更好的选择,比如Xdialog, gdialog和Kdialog,分别是基于X.org, Gtk+和KDE的图形对话框。使用的方法也和dialog命令大同小异。比如以下Kdialog的例子:      kdialog --title "ACAP entry" --password "Please enter the server access code:"     会产生一个询问密码的对话框:     图2     这里要为大家介绍的是Zenity,是基于Gtk的一个对话框工具,可以很方便的应用于shell脚本之中,并提供更方便的交互方式。比如你希望在脚本中输入一个日期作为参数,可以你有很多的脚本,这次应该用什么格式输入呢?MMDDYY?还是dd-mm-yyyy?而使用Zenity可以让你更轻松的选择:     图3      #zenity –calendar –date-format=%d-%m-%Y    选中的日期将以“%d-%m-%Y”的格式返回,和date命令对日期格式的定义是一样的:“04-08-2008” 下面我们用一个示例脚本来演示一下zenity的用法:      #!/bin/bashFINDLOG="Find MyApp log files"ADDUSER="Add a new user"CONHOST="Connect to a remote host"function findlog{        DATESEL=`zenity --calendar --title="Select a day" --text="To view the log files of 'My App' updated in a single day, please select a date" --date-format=%m-%d-%Y`        zenity --text-info --title="myapp-$DATESEL.log" --filename="myapp-$DATESEL.log"}function adduser1{        USERNAME=`zenity --entry --text="Please input user name:" --title "Input User Name"`        PASSWORD1=`zenity --entry --text="Please input passoword:" --title "Input Password" --hide-text`        PASSWORD2=`zenity --entry --text="Please input passoword again:" --title "Input Password" --hide-text`        while [ "$PASSWORD1" != "$PASSWORD2" ]        do                zenity --error --text="Passwords do not match"                PASSWORD1=`zenity --entry --text="Please input passoword:" --title "Input Password" --hide-text`                PASSWORD2=`zenity --entry --text="Please input passoword again:" --title "Input Password" --hide-text` Done   ENCRYPTEDPASSWORD=`echo $PASSWORD | makepasswd –clear-form=- --crypt | awk ‘{print $2}’`        useradd $USERNAME –p $ENCRYPTEDPASSWORD}function conhost{        HOSTSEL=`zenity --list --editable --separator="@" --print-column=ALL --title "Host Selection" --column Host --column User Toast root`        ssh ${HOSTSEL#*@}@${HOSTSEL%@*}}############################## 主程序############################# zenity --info --title="Zenity Demo" --text="Press Enter to start the demo program of Zenity"export SELECTION=`zenity --list --radiolist --title="Command Center" --text="Select the operation you want to perform" --column "" --column "Command" True "$FINDLOG" False "$ADDUSER" False "$CONHOST"`if [ -z "$SELECTION" ]then        exit 0fiif [ "$SELECTION" = "$FINDLOG" ]then        findlogelif [ "$SELECTION" = "$ADDUSER" ]then        adduser1 elif [ "$SELECTION" = "$CONHOST" ]then        conhostfi       这段代码做了几件简单的事情。首先主程序部分(见注释)是一个由zenity生成的列表,用来让用户选择最常用的几个功能:     图4     这个是一个用到了Zenity提供的List功能。注意,缺省情况下这个对话框的返回值是被选中行的第一列的值,但是因为第一列被设置成了Radiobox,所以返回的是第二列的值。如果希望多选的话,可以使用—check-list选项。     选择了希望执行的操作之后,就会转到对应的shell函数。这个脚本提供了三个功能,搜索某一个应用程序在某一天的日志文件,添加一个新用户和用SSH连接到另一个主机。我们先来看一下第一个功能。这个功能需要的输入是一个日期,然后查找名字为“MyApp-日期.log”的日志文件。     图5     需要的只是选择一个日期。     第二个功能是添加一个用户。需要输入需要添加的系统用户的名字:     图6 输入用户名之后,需要输入两次用户的密码。因为使用了—hide-text选项,用户输入的字符都被显示成“*”。     图7     如果两次输入不一致,会被要求重新输入。     图8     如果输入正确,那么一个系统用户将被成功添加。     第三个功能是连接一个远端的主机。这次仍然是使用List,但是没有使用Radio List,所以可以通过点击一行任何一个位置来选择:     图9     这两个参数:--separator="@" --print-column=ALL 的作用是返回Toast@root这样格式的字符串,这个显然不符合SSH的要求,所以用bash的字符串替换功能来处理一下再作为SSH的参数:ssh ${HOSTSEL#*@}@${HOSTSEL%@*}     上面就是对这个脚本的简单解释,只是一个示例,在实际的工作中,zenity还可以提供更多的能力来帮助大家写出更易用和强大的脚本来。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部