在脚本中添加颜色

  shell脚本一直单调,但是在图形环境下运行,除了read和echo语句外,还有其他许多与脚本用户交互的方法。这一节深入介绍几种不同的方法。

1、创建文本菜单

  创建交互式的shell文本,主要使用case语句

  1.1、创建菜单布局

    确定所要显示的内容: echo -e #-e指定了输出内容中必须要包含制表符和换行符。

    例如:echo -e "1. Display disk space"

    设置菜单:

clear
echo
echo -e "			Sys Admin Menu
"
echo -e "	1.Display disk space"
echo -e "	2.Display logged on users"
echo -e "	3.Display memory usage"
echo -e "	0.Exit menu/n/n"
echo -en "		Enter option: "  #-en 显示该行,而不在行尾添加换行符

    创建菜单的最后一部分是获取客户的输入。我们通过read命令来完成

read -n 1 option

  1.2、创建菜单函数

    为每个选项创建独立的函数,然后再在case语句中调用即可;

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

    在shell脚本菜单中,有助于解决问题的一种做法是将菜单布局本身作为函数来创建:

function menu {
    clear
    echo 
    echo -e "			Sys Admin Menu
"
    echo -e "	1.Display disk space"
    echo -e "	2.Display logged on users"
    echo -e "	3.Display memory usage"
    echo -e "	0.Exit program

"
    echo -en "		Enter option: "
    read -n 1 option
}

    这样,我们只要代用menu函数,就可以很容易的随时再显示该菜单即可。

  1.3、添加菜单逻辑

    再添加逻辑关系。需要使用case语句来完成

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

  1.4、将其全部组合在一起

    有了选项,函数,与逻辑关系,我们需要将他们组合起来:

#!/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 "			Sys Admin Menu
"
    echo -e "	1.Display disk space"   
    echo -e "	2.Display logged on users"
    echo -e "	3.Display memory usage"
    echo -e "	0.Exit program

"
    echo -en "		Enter option: "
    read -n 1 option
}

while [ 1 ]
do
    menu
    case $option in
    0)
        break ;;
    1)
        diskspace ;;
    2)
        memusage ;;
    *)
        clear
        echo "Sorry, wrong selection";;
    esac
    echo =en "
m		Hit any key to continue"
    read -n 1 line
done
clear

    多加了一个while循环,不断重复菜单,直到用户选择0,则跳出循环;

    这个脚本模板用于创建任何的shell脚本菜单界面。它同乐与用户交互的一种简单方式;

  1.5、使用select命令

    select命令容许从单命令行创建菜单。然后获取输入的答案并自动处理它。

select variable in list
do 
    commands
done

    列表参数是用空格隔开的构建菜单的的文本项列表。select命令将列表中的每一项显示为一个编号选项,然后为选择显示一个特殊的提示符(由PS3环境变量定义)

#!/bin/bash
# using select in the menu

function diskspace {
    clear
    df -k
}

function whoseon {
    clear
    who
}

function memusage {
    clear
    cat /paroc/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

    运行该脚本:

2、添加颜色

  现在脚本变得较为复杂,则需要颜色来区分;

  2.1、ANSI转移码

    ANSI转意码以控制序列显示器(GSI)开头,后面表示在显示器上执行的操作数据。要控制显示格式,必须使用选择图形再现(SGR select graphic rendition)

    格式为:CSIn[;k]m

    m代表SGR转意码。n和k参数定义所使用的显示控制。显示控制参数有3类:1、效果控制代码;2、前景色控制代码;3、背景色控制代码。如下图:

    例如:斜体字 GSI3m

    例如:斜体闪烁字 GSI3;5m

    前景色和背景色则用两位数来控制:

    指定白色为前景色:GSI37m

    设置白色为背景:GSI47m

    在个控制码中,可以将这两种属性组合在一起。因此,要将背景色设置为黑丝,前景色设置为红色,可以发送代码:GSI31;40m

  2.2、显示ANSI转意码

    我们还需要echo命令,向发送普通文本一样,将ANSI转意码发送到终端会话。

    一个完整的转意码:^[[0m  #控制代码0,它将把显示重置为默认设置。

$ echo ^[[41mThis is a test

    这次测试后,新的shell提示符将恢复其原来的颜色方案:

$ echo ^[[1mThis is a test^[[0m
This is a test

    如果需要设置背景色和前景色,ANSI转意控制码容许在一个转移序列中指定两个转意码:

$ echo "^[[33;44mThis is a test^[[0m"
This is a test    

  2.3、在脚本中使用颜色

    在shell中调用ANSI转意控制码。

#!/bin/bash
# menu using colors

function diskspace {
    clear
    df-k
}

funciton whoseon
    clear
    who
}

function memusage {
    clear
    cat /proc/meminfo
}

function menu {
    clear
    echo
    echo -e "			Sys Admin Menu
"
    echo -e "	1.Display disk space"
    echo -e "	2.Display logged on users"
    echo -e "	3.Display memory usage"
    echo -e "^[[1m	0. Exit program

^[[0m^[[44;33m"
    echo -en "		Enter option: "
    read -n 1 option
}

echo "^[[44;33m"
while [ 1 ]
do
    menu
    case $option in
    0)
        break ;;
    1)
        diskapace ;;
    2)
        whoseon ;;
    3)
        memuage ;;
    *)
        clear
        echo -e "^[[5m			Sorry,wrong selection^[[0m^[[44;33m";;
    esac
    echo -en "

			Hit any key to continue"
    read -n 1 line
done
echo "^[[0m"
clear

3、制作窗口

  dialog工具为我们制作类似于windows的对话框

  3.1、dialog软件包

    widget是dialog中的小部件,可以用来包装选项;

    用法:dialog --widget parameters

    parameters定义该小部件窗口的代销以及它所虚的任何文本。

    每个对话框小部件均以两种形式提供输出:1、使用STDERR;2、使用退出代码状态;

    如果小部件返回任何数据,例如一个菜单选项,dialog命令将该数据发送到STDERR。可以使用标准的bash shell技术讲STDERR输出重定向至另外一个文件或文件描述;

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

    1、msgbox小部件

    显示简单的信息

    dialog --msgbox test height width  #定义height和width参数自动调整文本以适应所穿件的窗口大小。--title参数定义标题

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

    2、yesno小部件

    提供yes/no选项的串口

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

    echo $?

    3、输入框小部件

    inputbox小部件,为用户输入文本字符串,提供了一个简单的文本框。

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

    echo $?

    cat age.txt

    4、文本框小部件

    在这个文本框内可以输入大量的提示信息

    dialog --texbox /etc/passwd 15 45

    5、菜单小部件

    提供菜单选项

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

    6、fselect小部件

    使用文件名时,fselect小部件机器方便。无需前置用户输入文件名,而是利用fselect小部件流量文件从而选择文件

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

    分为左侧目录列表;右侧目录列表;和输入列表;

  3.2、dialog选项

    dialog还有很多的长选线,提供参数选择;

    --backtitle 选项时穿件贯穿脚本的通用菜单标题的一种时分方便的方法。如果为每个对话框窗口自定,该选项将贯穿应用程序始终,为脚本穿件专业级的外观;

  3.3、在脚本中使用dialog命令

    使用dialog命令注意两点:1、如果cancel或者no按钮可用,请检查dialog命令的退出状态;2、重定向STDERR以获取输出值;

#!/bin/bash
# using dialog to create a menu

temp=`mktemp -t test.XXXXXX`
temp2=`mktemp -t test2.XXXXXX`

function diskspace {
    df -k > $temp
    dialog --textbox $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 user" 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 --msbox "Sorry, invalid selection" 10 30
esac
done
rm -f $temp 2> /dev/null
rm -f $temp2 2> /dev/null

4、获取图形

  如果需要更多的图形,无论是KDE好事GNOME周免都扩充了dialog命令的思想。各自都有自己的X Windows图形小不讲;

  kdialog和zenity分别就是KDE和GNOME的桌面图形工具;

  4.1、KDE环境

    kdialog工具;

    1、kdialog小部件

    使用格式:kdialog display-options window-options arguments

    使用kdialog窗口小部件时,会在KDE桌面环境下显示为一个独立窗口,而不是包含在终端模拟器会话中

    checklist和radiolist小部件容许您定义列表中的单独项目,以及它们是否默认选中:

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

    2、使用kdialog

    使用对话框小部件。使得kdialog窗口输出使用STDOUT而非STDERR输出;

#!/bin/bash
# using kdialog to create a menu

temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`

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

function whoseon {
    who > $temp
    kdialog --texbox $temp 500 10
}

function memusage {
    cat /proc/meminfo > $temp
    kdialog --textbox $temp 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"
esac
done
#!/bin/bash
# using kdialog to create a menu

temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`

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

function whoseon {
    who > $temp
    kdialog --texbox $temp 500 10
}

function memusage {
    cat /proc/meminfo > $temp
    kdialog --textbox $temp 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"
esac
done
#!/bin/bash
# using kdialog to create a menu

temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`

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

function whoseon {
    who > $temp
    kdialog --texbox $temp 500 10
}

function memusage {
    cat /proc/meminfo > $temp
    kdialog --textbox $temp 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"
esac
done
#!/bin/bash
# using kdialog to create a menu

temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`

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

function whoseon {
    who > $temp
    kdialog --texbox $temp 500 10
}

function memusage {
    cat /proc/meminfo > $temp
    kdialog --textbox $temp 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"
esac
done

  4.2、GNOME环境

    GNOME图形化环境支持两种可以生成标准串口流行软件包:1、gdialog;2、zenity;

    zenity是最常见的软件包。本地介绍zenity的功能并说明如何在shell及保本中使用它。

    1、zenity小部件

    zenity程序的工作方式与kdialog程序和dialog程序略有不同。许多类型的小不讲要在命令行上使用附加的选项来定义,而不是将它们作为选项的参数。

    $ zenity --calendar

    11/25/2019

    $ zenity --file=selection

    /home/ubuntu/menu5

    2、脚本中使用zenity

    zenity不遵守dialog和kdialog中使用的选项特定,因此将任何现有的交互式脚本转换为zenity都具有挑战性;

#!/bin/bash
# using zenity to create a menu

temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`

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

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

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

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

selection=`cat $temp2`
case $selection in
"Display disk space")
    diskspace ;;
"Display users")
    whoseon ;;
"Display memory usage")
    memusage ;;
Exit)
    break ;;
*)
    zenity --info "Sorry, invalid selection"
exac
done
原文地址:https://www.cnblogs.com/BurnovBlog/p/10802903.html