在脚本中添加颜色

在脚本中添加颜色

       原因是:shell脚本一直被认为是单调乏味的。

15.1 创建文本菜单

       创建交互式shell脚本最常见的方法是利用菜单。为用户提供各种选项有助于知道他们了解脚本的确切功能。

       Shell脚本菜单的核心是case命令,case命令根据用户在菜单中选择的字母执行特定的命令。

15.1.1 创建菜单布局

       命令echo仅显示可打印字符,所以,如果希望使用不可打印项,必须使用-e选项。

       命令read使用-n选项后,输入内容不需要按ENTER键。

比如:

#!/bin/bash

#create the munu layout

 

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 program\n\n"

echo -en "\t\tEnter Option: "

 

read -n 1 option

}

 

function diskspace

{

       clear

       df -k

}

 

function whoseon

{

       clear

       who

}

 

function memusage

{

       clear

       cat /proc/meminfo

}

 

 

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

15.1.5 使用select命令

       创建文本菜单的大多数问题就是创建菜单布局和获取输入的答案,bash shell提供了一个便利的小工具,可以自动完成所有这些工作。

       命令select允许从单命令行创建菜单,然后获取输入的答案并自动处理它。命令select的格式是:

select variable in list

do

       commands

done

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

例如下面的这个示例:

#!/bin/bash

#using select in the 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

       clear

       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

       有一点需要注意的是,存储在变量中的结果值是整个文本字符串,而不是与该菜单项相关联的数字。文本字符串值才是需要在case语句中比较的内容。

15.2 添加颜色

       目前有很多的终端模拟包,允许为交互式脚本添加颜色和特殊效果。

15.2.1 ANSI转义码

       大多数终端模拟软件能够识别设置显示输出格式的ANSI转义码。ANSI转义码以控制序列指示器(control sequence indicatorCSI)开头,后面跟表示要在显示器上执行的操作的数据。CSI告诉终端该数据表示一个转义码。

       要控制显示格式,必须使用选择图形再现(Select Graphic RenditionSGR)转义码,SGE转义码的格式为:

       CSIn[;k]m

       该代码中的m代表SGR转义码。nk参数定义所使用的显示控制。可以仅指定一个参数或者同时指定两个,中间用分号隔开。显示控制参数有3类:

l  效果控制代码;

l  前景色控制代码;

l  背景色控制代码;

ANSI SGR效果控制代码

代码

描述

代码

描述

0

重置为普通模式

4

使用单下划线(可以)

1

设置为强亮度(在bash中是加粗)

5

6

使用慢闪烁(没有反应)

使用快闪烁

2

设置为弱亮度(在bash中可以)

7

背景、前景颜色反转(可以)

3

使用斜体(这个在bash中不起作用)

8

将前景色设置为背景色(可以)

因此:要将显示设置为使用倾斜的字体,需要发送代码:

CSI3m

如果需要使用斜体和闪烁,可以发送代码:

CSI3;5m

       前景色控制码和背景色控制码都使用两位数代码。前景色使用3开头的一个两位数的值,而背景色使用4开头的两位数的值,其中的第二位数字表示具体颜色。

       ANSI颜色控制代码:

代码

颜色

代码

颜色

0

黑色

4

蓝色

1

红色

5

洋红色

2

绿色

6

青色

3

黄色

7

白色

因此,要指定白色前景,发送代码:

CSI37m

要设置背景色为黑色,前景色为红色,可以发送代码:

CSI31;40m

15.2.2 显示ANSI转义码

       上面所说的都可以使用echo命令发送,像发送普通文本一样,将ANSI转义码发送到终端会话。唯一比较难的部分是创建CSI字符。

       CSI字符通常是一个两字符序列,这个序列是ESC ASCII值,后跟左方括号字符。记住,输入方法为:Ctrl+V组合键后跟ESC。在输入此组合键时,字符^[出现。

       下面为两个例子:

clip_image002

       注意,在一个echo命令中放置两个转义控制码时,重要的是要用双引号将代码字符串引起来。如果没有双引号,echo命令就不能正确地解释转义码,进而产生错误消息。

15.2.3 在脚本中使用颜色

       将前面的shell脚本只需添加上一行颜色控制码。

clip_image004

#!/bin/bash

#create the munu layout

 

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 program\n\n"

echo -en "\t\tEnter Option: "

 

read -n 1 option

}

 

function diskspace

{

       clear

       df -k

}

 

function whoseon

{

       clear

       who

}

 

function memusage

{

       clear

       cat /proc/meminfo

}

 

echo “^[[44;33m”

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

15.3 制作窗口

       dialog软件包是一个较好的小工具,最初有Savio Lam设计,是一个可以和shell脚本配合使用的文本届面下的创建对话框的工具。

       常见的对话框空间选项:

常见的对话框控件选项有:

类型       用于创建类型的选项         

–calendar    提供了一个日历,让你可以选择日期

–checklist     允许你显示一个选项列表,每个选项都可以被单独的选择  (复选框)

–from       允许您建立一个带标签的文本字段,并要求填写

–fselect      提供一个路径,让你选择浏览的文件

–gauge    显示一个表,呈现出完成的百分比,就是显示出进度。

–infobox    显示消息后,(没有等待响应)对话框立刻返回,但不清除屏幕  (信息框)

–inputbox     让用户输入文本  (输入框  )

–inputmenu   提供一个可供用户编辑的菜单 (可编辑的菜单框)

–menu       显示一个列表供用户选择   (菜单框)

–msgbox    显示一条消息,并要求用户选择一个确定按钮 (消息框  )

–pause      显示一个表格用来显示一个指定的暂停期的状态

–passwordbox   显示一个输入框,它隐藏文本

–passwordfrom  显示一个来源于标签并且隐藏的文本字段

–radiolist      提供一个菜单项目组,只有一个项目,可以选择 (单选框)

–tailbox      在一个滚动窗口文件中使用tail命令来显示文本

–tailboxbg    tailbox类似,但是在background模式下操作

–textbox    在带有滚动条的文本框中显示文件的内容  (文本框)

–timebox   提供一个窗口,选择小时,分钟,秒

–yesno      提供一个带有yesno按钮的简单信息框  (/否框)

       要在命令行上具体制定一个特定的小部件,需要使用双破折号格式:

dialog –widget parameters

       其中的widget为上面所说的控件,parameters定义该小部件窗口的大小以及它所需要的任何文本。

       每个对话框小部件均以两种形式提供输出:

l  使用STDERR

l  使用退出代码状态;

dialog命令的退出状态决定用户所选择的按钮,如果选择OKYes按钮,该dialog命令将返回0退出状态;如果选择CancelNo按钮,返回1退出状态,可以使用标准$?变量确定在该对话框小部件中选择的按钮。

比如:

msgbox小部件

dialog – – title Testing – -msgbox “This is a test” 10 20

clip_image006

       此时的OK键是支持鼠标点击的,只是没有什么效果。

yesno小部件

dialog – -title “Please answer” – -yesno “is this thing on” 10 20

clip_image008

而对于inputbox小部件为用户输入文本字符串提供了一个简单的文本框。dialog命令将文本字符串的值发送到STDERR,所以必须重定向才能获取答案。例如:

输入框小部件

dialog – -inputbox “Enter your age” 10 20 2>age.txt

clip_image010

完成后,将会生成一个age.txt文件保存输入的27。此时我们可以再次重定向以使用该值。

文本框小部件

dialog – -textbox /etc/passwd 15 45

clip_image012

       可以使用方向键在文本文件中上下左右移动。

菜单小部件

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

clip_image014

       移动方向键可以高亮显示标记的条目,在输入OK后会将选择的条目tag发送到text.txt文件中。

fselect小部件

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

clip_image016

 

 

dialog选项

 

 

 

选项

描述

–add-widged

除非按EscCancel键,否则继续进入下一个对话框。

–aspect ratio

指定窗口宽度/高度的纵横比

backtitle  backtitle

指定backtitle字符串显示在背景下,在屏幕的顶部。

begin   x y

指定的位置在屏幕上的上一个对话框的左上角

–cancel-label label

Cancel按钮指定一个可供选择的标签

–clear

使用对话框默认背景色清除显示

colors

允许在对话框文本中潜入ANSI颜色代码

–cr-wrap

允许在对话框文本中加入换行符,强制换行

–create-rc file

转储样本配置文件至指定文件

defaultno

将默认值 yes/no对话框设置为使用no

default-item string

设置在一份清单,表格或菜单中的默认项目。通常在框中的第一项是默认

–exit-label label

Exit按钮指定一个可供选择的标签

–extra-button

OKCancel按钮之间,显示一个其他按钮

–extra-label label

extra按钮指定一个可供选择的标签

–help

显示dialog命令的帮助信息

–help-button

OKCancel按钮之后显示Help按钮

–help-label label

help按钮指定一个可供选择的标签

–help-status

help按钮中的帮助信息被选中后,记录下检查列表、单选框列表或表单信息

–ignore

忽略dialog不能识别的选项

–input-fd fd

STDIN之外,指定其他可供选择的文件描述符

insecure

输入部件的密码时,明文显示不安全,使用星号来代表每个字符,这样安全点

–item-help

在屏幕的底部,为检查列表、单选框列表、菜单中的每一个标签添加该标签的帮助

–keep-window

不要清除屏幕上的旧小部件

–max-input size

指定输入字符串的最大规模,默认为2048

nocancel

设置在输入框,菜单,和复选框中,禁止选cancel”

–no-collapse

在对话框文本中,不要将制表换行符转换为空格。

–no-kill

tailboxbg对话框放在背景中,并禁止该进程的SIGHUP

–no-label label

No按钮指定一个可供选择的标签

no-shadow

禁止阴影出现在每个对话框的底部

ok-label  string

覆盖使用OK按钮的标签

–output-fd fd

STDERR之外,指定其他可供选择的文件描述符

–print-maxsize

打印对话框窗口允许输出的最大尺寸

–print-size

将每个对话框窗口的尺寸打印至输出

–print-version

将对话框版本打印至输出

–separator-output

无需引用,将checklist小部件的结果一次一行的输出

–separator string

指定一个字符串来隔离每个小部件的输出

–separator-widget string

指定一个字符串来隔离每个小部件的输出

–shadow

绘制阴影至每一个窗口的右下方

–single-quoted

需要时对检查列表输出使用单引用

–sleep sec

在处理对话框窗口后延迟指定的秒数

–stderr

将输出发送至STDERR,这是默认行为

–stdout

将输出发送至STDOUT

–tab-correct

将换行符转换为空格

–tab-len n

指定一个制表符所使用的空格数,默认为8

timeout  secs

超时(返回的错误代码),如果用户在指定的时间内没有给出相应

title  title

指定将在对话框的上方显示的标题字符串

–trim

删除对话框文本中字符串首部的空格和换行符

–visit-items

为了把项目列表包含在内,而修改对话框窗口中的制表符

–yes-label label

yes按钮指定一个可供选择的标签

其中的backtitle  backtitle选项是创建贯穿脚本的通用菜单标题的一种十分方便的方法。如果为每个对话框窗口置顶,该选项将贯穿应用程序始终,为脚本创建专业级的外观。

 

在脚本中使用dialog命令

       在脚本中使用dialog命令时一件非常容易的事情。只需要记住两点:

l  如果CancelNo按钮可用,请检查dialog命令的退出状态;

l  重定向STDERR以获取输出值

如果遵循上面的两条规则,就可以立即获得专业外观的交互式脚本。例如:

clip_image018

#!/bin/bash

#using dialog to create a menu

 

temp=`mktemp -t test.XXXXXX`

temp2=`mktemp -t test2.XXXXXX`

 

function diskspace

{

       #clear

       df -k > $temp

       dialog –textbox $temp 20 60

}

 

function whoseon

{

       #clear

       who > $temp

       dialog –textbox $temp 20 50

}

 

function memusage

{

       #clear

       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 logged on users" 3 "Display memory usage" 0 "Exit program" 2>$temp2

 

if [ $? -eq 1 ]

then

       break

fi

selection=`cat $temp2`

 

       case $selection in

       0)

              break;;

       1)

              diskspace;;

       2)

              whoseon;;

       3)

              memusage;;

       *)

              dialog –msgbox "Sorry, wrong selection" 10 30

       esac

done

rm -f $temp 2>/dev/null

rm -f $temp2 2>/dev/null

       其中temp用于保存各个命令的输出,temp2保存在主菜单对话框中选择的值。

15.4 获取图形

       KDEGNOME桌面环境都扩充了dialog命令的思想,在各自环境中包含了生成X Windows图形小部件的命令。

       比如KDE使用kdialog,而GNOME使用gdialogzenity

15.4.1 KDE环境

       KDE图形环境默认包括kdialog软件包,在KDE桌面环境下,kdialog软件包使用kdialog命令生成标准窗口,类似对话类型的小部件。这使您可以直接在shell脚本中创建Windows质量的用户界面。

       注意kdialogdialog最大的区别是,kdialog窗口小部件使用STDOUT而非STDERR输出值。

clip_image020

 

clip_image022

clip_image024

clip_image026

#!/bin/bash

#using kdialog to create a menu

 

temp=`mktemp -t test.XXXXXX`

temp2=`mktemp -t test2.XXXXXX`

 

function diskspace

{

       #clear

       df -k > $temp

       kdialog –textbox $temp 1000 10

}

 

function whoseon

{

       #clear

       who > $temp

       kdialog –textbox $temp 500 10

}

 

function memusage

{

       #clear

       cat /proc/meminfo > $temp

       kdialog –textbox $temp 300 500

}

 

 

while [ 1 ]

do

       kdialog –menu "Sys Admin Menu" "1" "Display disk space" "2" "Display logged on users" "3" "Display memory usage" "0" "Exit program" >$temp2

 

if [ $? -eq 1 ]

then

       break

fi

selection=`cat $temp2`

 

       case $selection in

       1)

              diskspace;;

       2)

              whoseon;;

       3)

              memusage;;

       0)

              break;;

       *)

              kdialog –msgbox "Sorry, wrong selection"

       esac

done

15.4.2 GNOME环境

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

l  gdialog

l  zenity

到目前为止,大多数GNOME桌面中,zenity是最常见的软件包。

clip_image028clip_image030

clip_image032

#!/bin/bash

#using zenity to create a menu

 

temp=`mktemp -t test.XXXXXX`

temp2=`mktemp -t test2.XXXXXX`

 

function diskspace

{

       #clear

       df -k > $temp

       zenity –text-info –title "Disk space" –filename=$temp  –width 750 –height 10

}

 

function whoseon

{

       #clear

       who > $temp

       zenity –text-info –title "Logged in users" –filename=$temp  –width 500 –height 10

#    zenity –text-info $temp 20 50

}

 

function memusage

{

       #clear

       cat /proc/meminfo > $temp

       zenity –text-info –title "Memory usage" –filename=$temp  –width 300 –height 500

       zenity –text-info $temp 20 50

}

 

 

while [ 1 ]

do

       zenity –list –radiolist –title "Sys Admin Menu" –column "Select" –column "Menu Item" FALSE "Display disk space" FALSE "Display logged on users" FALSE "Display memory usage" FALSE "Exit program" >$temp2

 

if [ $? -eq 1 ]

then

       break

fi

selection=`cat $temp2`

 

       case $selection in

       "Exit")

              break;;

       "Display disk space")

              diskspace;;

       "Display users")

              whoseon;;

       "Display memory usage")

              memusage;;

       *)

              zenity –info "Sorry, invalid selection"

       esac

done

       使用zenity软件包,可以在GNOME桌面上,为交互式shell脚本增加Windows的感觉。

日历的区别:

Kdialog

clip_image034

Zenity

clip_image036