shell脚本编程(四)
在命令行创建函数:
- 将函数定义在一行命令中:
function divem {echo $[ $1/$2 ];}
在命令行中定义函数时,每条命令的末尾必须包含分号。 使用多行命令定义函数。这样,bash shell使用次提示符提示输入更多命令。使用这种方法不需要子每条命令的结尾添加分号,只需按ENTER:
function multem{ >echo $[ $1*$2 ] >}
使用命令行来创建函数应当十分小心。如果自定义函数与内置命令或其他命令同名,那么这个自定义函数将覆盖原有命令。
- 将函数定义在一行命令中:
在.bashrc文件中定义函数:shell启动时都会在主目录下查找.bashrc文件。为避免麻烦,预先定义函数或库文件:
- 直接在.bashrc中定义函数
- 提供函数库文件(可以使用source命令(或称点操作符)将现有库文件的函数包含进.bashrc脚本)
创建菜单函数:创建菜单shell脚本的第一步是确定脚本要执行的函数,并将其作为代码中独立的函数来设计。常见的作坊是为未实现的函数创建桩函数(stub function):
function test{ clear }
- 在shell脚本菜单中有助于解决问题的一种做法是将菜单布局本身作为函数来创建。
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 /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
shell脚本编程–添加颜色
大多数终端模拟软件能够识别设置显示输出格式的ANSI转义码。ANSI转义码以控制序列指示器(control sequence indicator,CSI)开头,后面跟表示要在显示器上执行的操作的数据。CSI告诉终端该数据代表一个转义码。有些ANSI转义码可以用于将光标定位在显示器上的指定位置,擦除部分显示,以及控制显示的格式。要控制显示格式,必须使用选择图形再现(Select Graphic Rendition)转义码。SGR转义码的格式为:
CSI【;k】m #该代码中的m代表SGR转义码。n和k参数定义所使用的显示控制。可以仅知道能够一个参数或者同时指定两个,中间用分号隔开。
显示控制参数有3类:- 效果控制代码
- 前景色控制代码
- 背景色控制代码
- ANSI SGR效果控制代码
代码 | 描述 | 代码 | 描述 |
---|---|---|---|
0 | 重置为普通模式 | 5 | |
1 | 设置为强亮度 | 6 | 使用快闪烁 |
2 | 设置为弱亮度 | 7 | 背景、前景色反转 |
3 | 使用斜体 | 8 | 将前景色设置为背景色 |
4 | 使用单下划线 |
CSI3m #使用倾斜的字体
CSI3;5m #将显示设置为斜体和闪烁
- 前景色控制码和背景色控制码都使用两位数代码。前景色使用3开头的一个两位数的值;而背景色使用4开头的两位数的值。其中第二位数字表示具体颜色.
ANSI颜色控制代码
代码 | 描述 | 代码 | 描述 |
---|---|---|---|
0 | 黑色 | 4 | 蓝色 |
1 | 红色 | 5 | 洋红色 |
2 | 绿色 | 6 | 青色 |
3 | 黄色 | 7 | 白色 |
CSI37m #白色前景
CSI47m #白色背景
CSI31;40m #背景黑色,前景设置红色
- 显示ANSI转义码:CSI字符通常是一个两字符序列。这个序列是ESC ASCII值,后跟作方括号字符。Ctrl-V组合键,后跟Esc键,在输入此组合键时,字符“^[”出现(在使用ANSI转义码的脚本中常常会看到^[字符。看到该字符组合时,记住它是使用Ctrl-V Esc组合键生成的):
- ANSI颜色控制码会保持有效,直到另一个ANSI颜色控制码改变输出。
ANSI转义控制符允许在一个转义序列中指定两个代码,用双引号括起来。
#!/bin/bash function menu { clear echo "[34;47;1m" 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 } echo "[44;33m" while [ 1 ] do menu case $option in 1) clear;free -h;; 2) clear;users;; 3) clear;df -h;; 0) clear;break;; *)clear;echo -e "[5m\t\t\tplease input the number 1-3,or 0>[0m[44;33m";; esac echo -en "\n\n\t\tHit any key to continue" read -n 1 line done echo "[0m" clear
使用ANSI转移控制码创建脚本时必须谨慎。无论何时当终端模拟器遇到控制码,它都会处理。使用cat明林能够对含有ANSI转义控制码的脚本进行列表时,这尤其危险。cat命令将在显示器上回显该代码,然后终端模拟器解释这些代码,并改变显示。在改变很多显示特性的长脚本中,这会是一件十分恼人的事。