《Linux命令行与shell脚本编程大全》图形化桌面上的脚本编程


《Linux命令行与shell脚本编程大全》图形化桌面上的脚本编程
 
创建文本菜单
创建菜单布局
[plain] 
#!/bin/bash  
clear #清屏  
echo -e "\t\tMenu"  
echo -e "1.\tDisplay disk space"  
echo -e "2.\tDisplay logged on user"  
echo -e "3.\tDisplay memory usage"  
echo -e "0.\tExit menu\n\n"  
echo -en "\t\tEnter option:" #-n表示不打印回车  
read -n1 option #读取一个字符  
echo ""  
显示效果:
[plain] 
        Menu  
1.  Display disk space  
2.  Display logged on user  
3.  Display memory usage  
0.  Exit menu  
  
  
        Enter option:  
创建菜单函数
只需把上面的代码用函数包起来即可
添加菜单逻辑
[plain] 
#!/bin/bash  
option=""  
create_menu(){  
    clear  
    echo -e "\t\tMenu"  
    echo -e "1.\tDisplay disk space"  
    echo -e "2.\tDisplay logged on user"  
    echo -e "3.\tDisplay memory usage"  
    echo -e "0.\tExit menu\n\n"  
    echo -en "\t\tEnter option:"  
    read -n1 option  
    echo ""  
}  
  
create_menu  
  
case $option in  
0)  
echo "Display disk space";;  
1)  
echo "Display logged on user";;  
2)  
echo "Display memory usage";;  
3)  
echo "Exit menu";;  
*)  
echo "error";;  
esac  
添加对应的case即可,之后,我们再来实现相应的函数。
整合shell脚本菜单
首先添加case相应的实现函数
[plain] 
disk_space(){  
    clear  
    df -k  
}  
  
whoseon(){  
    clear  
    who  
}  
  
menu_usage(){  
    clear  
    cat /proc/meminfo  
}  
之后处理case部分
[plain] 
deal_menu(){  
    case $option in  
    1)  
    disk_space;;  
    2)  
    whoseon;;  
    3)  
    menu_usage;;  
    0)  
    echo "Exit menu";;  
    *) #输入错误,重新输入  
    echo -e "\nSorry, wrong selection."  
    echo -en "\n\n\t\tHit any key to continue."  
    read -n1 option #重新读取菜单选项  
    deal_menu;;  
    esac  
}  
  
deal_menu  
使用select命令
select命令允许从单个命令行创建菜单,然后再提取输入的答案并自动处理。
[plain] 
select variable in list  
do  
    commands  
done  
list参数是构成菜单的空格分割的文本选项列表。
select命令会在列表中将每个选项作为一个编好号的选项显示,然后为选项显示一个特殊的由PS3环境变量定义的提示符。(默认的提示符为#?)
[plain] 
PS3="Enter option:"  
select option in "Display disk space" "Display logged on user" "Display memory usage" "Exit menu"  
do  
    case $option in  
    "Display disk space")  
    disk_space;;  
    "Display logged on user")  
    whoseon;;  
    "Display memory usage")  
    menu_usage;;  
    "Exit menu")  
    echo "Exit menu"  
    break;;  
    *)  
    echo -e "\nSorry, wrong selection."  
    echo -en "\n\n\t\tHit any key to continue."  
    read -n1 option  
    deal_menu;;  
    esac  
done  
运行结果:
[plain] 
$ menu_test   
1) Display disk space      3) Display memory usage  
2) Display logged on user  4) Exit menu  
Enter option:  
select会自动生成菜单
注意:存储在变量中的结果是整个字符串,不是菜单选项前面的数字
 
使用窗口
安装dialog:sudo apt-get install dialog
dialog包
dialog部件
部件 描述
calendar 提供选择日期的日历
checklist 显示多个选项(其中每一个选项都能打开或关闭)
from 构建一个表单(用标签和文本字段来填充)
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命令会将数据发送到STDERR
msgbox部件
dialog --msgbox text height width
可以指定title
dialog --title Testing --msgbox "This is a test" 10 20
yesno部件
dialog --title "Do not lie to me" --yesno "Are you a girl?" 10 20
inputbox部件
dialog --title "Do not lie to me" --inputbox "Enter you age:" 10 20 2>age.txt
textbox部件
dialog --textbox /etc/passwd 15 45
可以显示大量文本,并且可以用方向键、Home、End、PgUp、PgDn等操作
menu部件
dialog --menu "Menu" 20 30 5 1 "A." 2 "B." 3 "C."
上面红色的参数表示菜单栏的高度为5个item高,前面两个参数是dialog的高和宽
fselect部件
dialog --title "select a file" --fselect /etc/ 10 50 2>file.txt
 
 
dialog选项
选项 描述
--add-widget 继续下个对话框,直到按下Esc或者Cancel
--aspect ratio 指定窗口宽度和高度的宽高比
--backtitle title 指定显示在屏幕顶部背景上的标题(2)
--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命令支持运行时配置。dialog启动时先去检查是否设置了DIALOGRC环境变量,该变量保存配置文件路径。
如果没有找到,则使用$HOME/.dialogrc。如果这个也不存在,就尝查找编译时指定的GLOBALRC(/etc/dialogrc),如果这个也不存在,就用编译默认值。
(2)--backtitle选项是为了脚本中的菜单创建公共标题的简便办法。如果给每个对话窗口都指定了该选项,那么它在应用中将保持一致。
在脚本中使用dialog命令
这里需要注意两点:
1.如果有Cancel或者No按钮,检查dialog命令的退出状态码
2.重定向STDERR来获得输出值
下面是将之前的代码改用dialog实现
[plain] 
#!/bin/bash  
temp=`mktemp -t temp.XXXXXX`  
temp2=`mktemp -t temp2.XXXXXX`  
disk_space(){  
    df -k > $temp  
    dialog --textbox $temp 20 60  
}  
  
whoseon(){  
    who > $temp  
    dialog --textbox $temp 20 50  
}  
  
menu_usage(){  
    cat /proc/meminfo > $temp  
    dialog --textbox $temp 20 50  
}  
  
dialog --menu "menu" 20 30 10 1 "Display disk space" 2 "Display logged on user" 3 "Display memory usage" 0 "Exit menu" 2>$temp2  
if [ $? -ne 1 ]  
then  
    selection=`cat $temp2`  
    case $selection in  
        1)  
            disk_space;;  
        2)  
            whoseon;;  
        3)  
            menu_usage;;  
        0)    ;;  
        *)  
        dialog --msgbox "Sorry, invalid selection" 10 30  
    esac  
fi  
  
rm -f $temp $temp2 2>/dev/null  
 
使用图形
KDE环境
安装kdialog
sudo apt-get install kdebase-bin
kdialog部件
和dialog类似,命令格式为:
kdialog display-options window-options arguments
window-options选项允许指定使用那种类型的窗口。
kdialog窗口选项
选项 描述
--checklist title [tag item status] 多选列表菜单,状态会说明该选项是否被选定
--error text 错误消息框
--inputbox text [init] 输入文本框。可以用init指定默认值
--menu title [tag item] 带有标题的菜单选择框,以及用tag标识的选项列表
--msgbox text 显示指定文件的简单消息框
--password text 隐藏用户输入的密码输入文本框
--radiolist title [tag item status] 单选列表菜单,状态会说明该选项是否被选定
--separate-output 为多选列表和单选列表菜单返回按行分开的选项
--sorry text “抱歉”消息框
--textbox file [width] [height] 显示file的内容的文本框,另外指定了width和height
--title title 为对话窗口的TitleBar区域指定一个标题
--warningyesno text 带有Yes和No按钮的警告消息框
--warningcontinuecancel text 带有Continue和Cancel按钮的警告消息框
--warningyesnocancel text 带有Yes、No和Cancel按钮的警告消息框
--yesno text 带有Yes和No按钮的提问框
--yesnocancel text 带有Yes、No和Cancel按钮的提问框
checklist和radiolist允许你在列表中定义单独的选项以及他们默认是否选定
使用kdialog
kdialog与dialog最大的不同就是kdialog将输出重定向到了STDOUT中。
GNOME环境
zenity部件
zenity窗口部件
选项 描述
--calendar 显示整月日历
--entry 显示文本输入对话窗口
--error 显示错误消息对话窗口
--file-selection 显示完整的路径名和文件名对话窗口
--info 显示信息对话窗口
--list 显示多选列表或单选列表对话窗口
--notification 显示通知图标
--process 显示进度条对话窗口
--question 显示yes/no对话窗口
--scale 显示可调整大小的窗口
--text-info 显示含有文本的文本框
--warning 显示警告对话窗口
zenity提供的窗口就比之前的dialog效果好多了
zenity --calendar
当选择了日期之后,zenity会将值返回到STDOUT中,和kdialog一样
 
 
在脚本中使用zenity
[plain] 
#!/bin/bash  
temp=`mktemp -t temp.XXXXXX`  
temp2=`mktemp -t temp2.XXXXXX`  
disk_space(){  
    df -k > $temp  
    zenity --text-info --title "Disk space" --filename=$temp --width 750 --height 300  
}  
  
whoseon(){  
    who > $temp  
    zenity --text-info --title "Logged on user" --filename=$temp --width 500 --height 200  
}  
  
menu_usage(){  
    cat /proc/meminfo > $temp  
    zenity --text-info --title "Memory usage" --filename=$temp --width 300 --height 500  
}  
  
zenity --list --radiolist --title "Menu" --column "Select" \  
--column "Menu Item" FALSE "Display disk space" FALSE "Display logged on user" FALSE "Display memory usage" FALSE "Exit" > $temp2  
if [ $? -ne 1 ]  
then  
    selection=`cat $temp2`  
    case $selection in  
        "Display disk space")  
            disk_space;;  
        "Display logged on user")  
            whoseon;;  
        "Display memory usage")  
            menu_usage;;  
        "Exit")    ;;  
        *)  
        zenity --info "Sorry. invalid selection."  
    esac  
fi  
  
rm -f $temp $temp2 2>/dev/null  
zenity不支持菜单对话框
 

相关内容

    暂无相关文章