十三、图形化桌面环境脚本编程

创建菜单布局

echo -e选项可以输出制表符和换行符

echo -en选项会去掉末尾换行符,这样光标会一直在行尾等待用户输入。

然后使用read -n 1 option限制只读取第一个字符

[root@tzPC 18Unit]# cat test1.sh 
#!/bin/bash
clear
echo
echo -e "\t\ttSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit menu\n\n"
echo -en "\t\tEnter option:"
read -n 1 option

 

这样菜单布局运行的结果是

 

 创建菜单函数

为每个菜单选项都创建独立的函数。

可以为还没有实现功能的函数创建一个桩函数,说明这个函数的用途。

function diskspace {
    clear
    echo "This is where the diskspace commands will go"
}

 

可以将菜单布局本身写入函数

function menu {
    clear
    echo
    echo -e "\t\ttSys Admin Menu\n"
    echo -e "\t1. Display disk space"
    echo -e "\t2. Display logged on users"
    echo -e "\t3. Display memory usage"
    echo -e "\t0. Exit menu\n\n"
    echo -en "\t\tEnter option:"
    read -n 1 option
}

添加菜单逻辑

使用case命令处理命令行参数

menu #先打印菜单布局
case $option in
0)
    break ;;
1)
    diskpace ;;
2)
    whoseon ;;
3)
    memusage ;;
*)
    clear
    echo "Sorry, wrong selection" ;;
esac

组后将各个部分整合成一个脚本

[root@tzPC 18Unit]# cat test1.sh
#!/bin/bash
#simple script menu
function diskspace {
    clear
    df -k
}

function whoseon {
    clear
    who
}

function memusage {
    clear
    cat /proc/meminfo
}

function menu {
    clear
    echo
    echo -e "\t\ttSys Admin Menu\n"
    echo -e "\t1. Display disk space"
    echo -e "\t2. Display logged on users"
    echo -e "\t3. Display memory usage"
    echo -e "\t0. Exit menu\n\n"
    echo -en "\t\tEnter option:"
    read -n 1 option
}

while [ 1 ] #一直循环菜单
do
    menu #使用menu函数打印菜单
    case $option in
    0) break ;;
    1) diskspace ;;
    2) whoseon ;;
    3) memusage ;;
    *)  clear
        echo "Sorry, wrong selection" ;;
    esac
    echo -en "\n\n\t\t\tHit any key to continue"
    read -n 1 line
done
clear

 

这个脚本很炫,可以自己写一下试一下。

使用select命令写菜单布局

语法格式

select variable in list
do
    commands
done

lis参数是由空格分隔的文本选项列表,select会将每个列表前加上一个编号。

将上面的脚本略微改动

[root@tzPC 18Unit]# cat test2.sh 
#!/bin/bash
#simple script menu
function diskspace {
    clear
    df -k
}

function whoseon {
    clear
    who
}

function memusage {
    clear
    cat /proc/meminfo
}

PS3="Enter option:" 
select option in "Display disk space" "Display logged on users" "Display memory usage" "Exit program"
do
    case $option in
    "Exit program") break ;;
    "Display disk space") diskspace ;;
    "Display logged on users") whoseon ;;
    "Display memory usage") memusage ;;
    *)  clear
        echo "Sorry, wrong selection" ;;
    esac
done
clear

 注意上面的PS3变量

PS3 是Prompt String 3的缩写,它是Linux/Unix下的一个用于控制select命令创建的菜单提示信息的环境变量,如果不写那么提示语句的位置会变成?符号

 

 制作窗口

dialog包可以创建标准的窗口对话框。

dialog命令使用命令行参数来决定生成哪种窗口部件。

dialog部件参数在书P384,太多我不想打,哈哈,不懂的要学会自己找man~

语法格式

dialog --widget parameters

其中widget为部件名

parameters定义窗口的大小以及部件需要的文本

每个部件输出方式

  1. 使用STDERR文件描述符
  2. 使用退出状态码

通过dialog命令的退出状态码确定用户选择的按钮

dialog命令的退出状态码为0,说明用户选择了yes按钮

退出状态码为1,用户选择的no按钮

状态码值可用$?变量确定

部件返回的数据会发送到STDERR文件描述符可通过重定向到文件或者其他文件描述符获知

[root@tzPC 18Unit]# dialog --inputbox "Enter your age:" 10 20 2> age.txt

 

 

 可以重定向到文件看到值20,并且没有换行符

[root@tzPC 18Unit]# cat age.txt 
20[root@tzPC 18Unit]# 

 

 msgbox部件

在窗口显示一条消息,点击OK才会消失

语法格式

dialog --msgbox text height width

 

 --title参数在窗口顶部写一个标题

[root@tzPC 18Unit]# dialog --title Testing --msgbox "This is a test" 10 20

 

 

 

 yesno部件

扩展了msgbox部件的功能,多了yes跟no按钮

[root@tzPC 18Unit]# dialog --title "Please answer" --yesno "Is this thing on?" 10 20

 

 

 

 此时如果选择了yes退出码就为0,选择no退出码为1

[root@tzPC 18Unit]# echo $?
0

 

 inputbox部件

多一个文本框用来输入文本,输入的文本会发送给STDERR,需要重定向才能获取文本框里的值。

上面的例子写过。

textbox部件

显示大量信息,会生成一个滚动的窗口显示由参数所指定的文件

[root@tzPC 18Unit]# dialog --textbox /etc/passwd 15 45

 

 

 menu部件

创建文本菜单窗口

[root@tzPC 18Unit]# dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk spac" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2>test.txt

--menu:定义菜单的标题

20:高

30:宽

10:窗口中一次显示菜单项的总数

这里书中有误,dialog命令会将选定的菜单项的标号发送到STDERR

 

 fselect部件

浏览文件位置并选择文件

[root@tzPC 18Unit]# dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt

 

fselect选项后的第一个参数是窗口中使用的起始目录位置,fselect部件窗口左侧文本框里显示的目录列表,右侧文本框里显示的是该目录下的文件列表,可以在底部的文本框中手动输入文件名或者目录使用空格选定。

注意:鼠标点击没用。

最后重定向到file.txt的值为底部文本框内的值。

 dialog选项

除了部件,dialog命令还支持很多选项,P390,太多了我不写,略略略。

其中--backtitle选项给把标题写在脚本背景左上角上,看起来更专业点。

[root@tzPC 18Unit]# dialog --backtitle "Select a file" --fselect $HOME/ 10 50 2>file.txt

 

 

 在脚本中使用dialog命令

记住使用dialog命令需要检查两样东西

  • 由yes/no按钮需要检查退出状态码
  • 重定向STDERR来获得输出值
[root@tzPC 18Unit]# cat menu3.sh 
#!/bin/bash
#using dialog to create a menu
temp=$(mktemp -t test.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)

function diskspace {
    df -k > $temp
    dialog --texbox $temp 20 60
}

function whoseon {
    who > $temp
    dialog --textbox $temp 20 50
}

function memusage {
    cat /proc/meminfo > $temp
    dialog --textbox $temp 20 50
}

while [ 1 ]
do
dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 0 "Exit" 2>$temp2

if [ $? -eq 1 ];then
    break
fi

selection=$(cat $temp2)
case $selection in 
1)diskspace ;;
2)whoseon ;;
3)memusage ;;
0)break ;;
*)dialog --msgbox "Sorry, invalid selection" 10 30
esac 
done

rm -rf $temp 2>/dev/null
rm -rf $temp2 2>/dev/null

脚本效果很炫酷,值得一试!

其他桌面版图形化编程

KDE环境

默认包含kdialog包,使用kdialog命令在KDE桌面生成类似dialog部件窗口。

这个作为了解,实际生产环境中不会安装图形化界面。

P393

GNOME环境

支持两种可生成标准窗口的包

  • gdialog
  • zenity

P396

 学习来自:《Linux命令行与Shell脚本大全 第3版》第18章

posted @ 2020-08-22 17:03  努力吧阿团  阅读(325)  评论(0编辑  收藏  举报