时间:2017年12月04日星期一
说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十八章学习总结

第十八章:图形化桌面环境中的脚本编程

本章内容

  • 创建文本菜单
  • 创建文本窗口部件
  • 添加X Window图形

18.1 创建文本菜单

创建交互式shell脚本最常用的方法是使用菜单,shell脚本菜单的核心是case命令,case命令会根据用户在菜单上的选择来执行特定命令。

18.1.1 创建菜单布局

常用命令

clear

清理出现在屏幕上的文本

echo -e

在echo命令中输出格式化的字符串,方便菜单项布局

echo -en

输出指定格式化字符串,但不会换行,光标在末尾等待用户输入

read -n 1

使用read命令-n选项来限制自读取一个字符

简单示例

clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t4. Exit menu\n\n"
echo -en "\t\tEnter option: "

read -n 1 option

18.1.2 创建菜单函数

  • shell脚本菜单选项作为一组独立的函数实现起来更为容易
  • 为每个菜单选项创建独立的shell函数
  • 通过会为还没有实现的函数先创建一个桩函数
  • 将菜单布局本身作为一个函数来创建

简单示例

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

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

18.1.3 添加菜单逻辑

  • 创建程序逻辑将菜单布局和函数结合起来
  • case命令根据菜单中输入的字符来调用相应的函数
  • 使用星号(*)来处理所有不正确的菜单项

简单示例

menu
case $option in
0)
    break ;;
1)
    diskspace ;;
2)
    whoseon ;;
3)
    memusage ;;
*)
    clear
    echo "Sorry, wrong selection";;
esac

18.1.4 整合shell脚本菜单

完整例子

编写menu1脚本

#!/bin/bash

function diskspace {
    clear
    df -k
}

function whoseon {
    clear
    who
}

function memusagee {
    clear
    cat /proc/meminfo
}

function menu {
    clear
    echo
    echo -e "\t\t\tSys 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
    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

18.1.5 使用select命令

命令格式:

select variable in list
do
    commands
done

命令说明:

  • list参数是由空格分割的文本选项列表,这些列表构成了整个菜单
  • select命令获取输入的答案并自动处理

编写smenu1脚本

#!/bin/bash

function diskspace {
    clear
    df -k
}

function whoseon {
    clear
    who
}

function memusagee {
    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

18.2 制作窗口

18.2.1 dialog包

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

安装dialog包以及需要的库

sudo apt-get install dialog

dialog部件

  • 部件:描述
  • calendar:提供选择日期的日历
  • checklist:显示多个选项(其中每个选项都能打开或关闭)
  • form:构建一个带有标签以及文本字段(可以填写内容)的表单
  • fselect:提供一个文件选择窗口来浏览选择文件
  • guage:显示完成的百分比进度条
  • infobox:显示一条消息,但不用等待回应
  • inputbox:提供一个输入文本用的文本表单
  • inputmenu:提供一个可编辑的菜单
  • menu:显示可选择的一系列选项
  • msgbox:显示一条消息,并要求用户选择ok按钮
  • pause:显示一个进度条来显示暂定期间的状态
  • passwordbox:显示一个文本框,但会隐藏输入的文本
  • passwordform:显示一个带标签和隐藏稳定字段的表单
  • radiolist:提供一组菜单选项,但只能选择其中一个
  • tailbox:用tail命令在滚动窗口中显示文件的内容
  • tailboxbg:跟 tailbox一样,但是在后台模式中运行
  • textbox:在滚动窗口中显示文件的内容
  • timebox:提供一个选择小时、分钟和秒数的窗口
  • yesno:提供一个带有Yes和No按钮的简单消息

使用格式

dialog –widget parameters

1.msgbox部件

使用说明

dialog –title Testing –msgbox text height width
  • text参数是在窗口中显示的字符串
  • dialog命令会根据height和width参数创建的窗口大小来自动换行
  • title参数指定窗口的标题

实例

dialog --title Testing --msgbox "This is a test" 10 20

2.yesno部件

使用说明

  • yesno部件允许用户对窗口中显示的问题选择yes或no
  • 用户选择了No按钮,退出状态码是1;如果选择了Yes按钮,退出状态码就是0

实例

dialog --title "Please answer" --yesno "Is this thing on?" 10 20

3.inputbox部件

使用说明

  • inputbox提供一个简单的文本框区域来输入文本字符串
  • dialog命令会将文本字符串的值发给STDERR,通过重定向STDERR来获取用户输入
  • 用户选择了OK按钮,退出状态码是0;反之,退出状态码就是1

实例

dialog --inputbox "Enter your age: " 10 20 2>age.txt

4.textbox部件

使用说明

  • textbox部件在窗口中显示大量信息

实例

dialog --textbox /etc/passwd 15 45

5.menu部件

使用说明

  • menu部件用来创建文本菜单的窗口版本
  • dialog命令会将选定的菜单项文本发送到STDERR,通过重定向STDERR来获取选择

实例

dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2>test.txt

6.fselect部件

使用说明

  • 使用fselect部件来浏览文件的位置并选择文件

实例

dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt

18.2.2 dialog选项

  • dialog命令有很多不同的选项
  • --title选项可以设置窗口顶部的标题
  • --backlist选项可以为脚本中的菜单创建公共标题
  • 还有其它许多选项,此处省略

18.2.3 在脚本中使用dialog命令

如果要在脚本中使用dialog命令,则必须遵守以下规范

  • 如果有Cancel或No按钮,检查dialog命令的退出状态码
  • 通过重定向STDERR来获取输出值

使用dialog部件来创建系统管理菜单

编写menu3脚本

#!/bin/bash

temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)

function diskspace {
    dialog --textbox $temp1 20 60
}

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

function memusage {
    cat /proc/meminfo > $temp1
    dialog --textbox $temp1 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 -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null

18.3 使用图形

18.3.1 KDE环境

  • KDE图形化环境默认包含kdialog包
  • kdialog包使用kdialog命令在KDE桌面上生成类似于dialog式部件的标准窗口
  • 需要检查系统是否已安装kdialog包

1.kdialog部件

使用说明

格式:

kdialog display-options window-options arguments
  • window-options选项指定使用哪种类型的窗口部件

实例:

kdialog --checklist "Items I need" 1 "Toothbrush" on 2 "Toothpaste" off 3 "Hair brush" on 4 "Deodorant" off 5 "Slippers" off

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按钮的提问框

2.使用kdialog

使用kdialog创建系统管理菜单

编写menu4脚本

#!/bin/bash

temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)

function diskspace {
    df -k > $temp1
    kdialog --textbox $temp1 1000 10
}

function whoseon {
    who > $temp1
    kdialog --textbox $temp1 500 10
}

function memusage {
    cat /proc/meminfo > $temp1
    kdialog --textbox $temp1 300 500
}

while [ 1 ]
do
    kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2
    if [ $? -eq 1 ]
    then
        break
    fi

    selection=$(cat $temp2)

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

rm -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null

18.3.2 GNOME环境

GNOME图形化环境支持两种流行的可生成标准窗口的包

  • gdialog
  • zenity

1.zenity

zenity窗口部件

  • 选项:描述
  • --calendar:显示一整月日历
  • --entry:显示文本输入对话窗口
  • --error:显示错误消息对话窗口
  • --file-selection:显示完整的路径名和文件名对话窗口
  • --info:显示信息对话窗口
  • --list:显示多选列表或单选列表对话窗口
  • --notification:显示通知图标
  • --progress:显示进度条对话窗口
  • --question:显示yes/no对话窗口
  • --scale:显示可调整大小的窗口
  • --text-info:显示含有文本的文本框
  • --waring:显示警告对话窗口

2.在脚本中使用zenity

编写menu5脚本

#!/bin/bash

temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)

function diskspace {
    df -k > $temp1
    zenity --text-info --title "Disk space" --filename=$temp1 --width 750 --height 10
}

function whoseon {
    who > $temp1
    zenity --text-info --title "Logged in users" --filename=$temp1 --width 500 --height 10
}

function memusage {
    cat /proc/meminfo > $temp1
    zenity --text-info --title "Memory usage" --filename=$temp1 --width 300 --height 500
}

while [ 1 ]
do
    zenity --list --radiolist --title "Sys Admin Menu" --column "Select" --column "Menu Item" FALSE "Display diskspace" FALSE "Display users" FALSE "Display memory usage" FALSE "Exit" > $temp2
    if [ $? -eq 1 ]
    then
        break
    fi

    selection=$(cat $temp2)

    case $selection in
    "Display diskspace")
        diskspace ;;
    "Display users")
        whoseon ;;
    "Display memory usage")
        memusage ;;
    Exit)
        break ;;
    *)
        zenity --info "Sorry, invalid selection" 10 30
    esac
done

rm -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null

18.4 小结

本章主要讲解了如何在shell脚本中创建菜单以及在图形化环境中编写交互式脚本


妙手空空
1.3k 声望370 粉丝

博观而约取,厚积而薄发