一、 条件测试语句
Shell提供测试语句来测试各种条件(通常用于控制语句中)。测试语句
以中括号[]括住测试条件,中括号前后需留有空格,几种测试条件如下:
1、字符串测试:用于测试两个字符串是否相等。
[ string1 = string2 ] 字符串string1和string2是否相等
[ $name =’Johne’ ] 变量name的值是否为字符串John
[ $name = $string ] 变量name的值是否等于变量string的值
[ $string ] 变量string的值是否为空
[ -z string ] string的长度是否为0
[ -n string ] string的长度是否不为0
[ “string” ] string的长度是否为0
[ string1!=string2 ] 字符串string1和string2是否不相等
[ $name!=’Jone’ ] 变量name的值是否不等于字符串Jone
[ $name!=$string ] 变量name的值是否不等于变量string的值
[ !”string” ] 变量string的值是否不为空
例如:if [ “$name” ]
then
echo “name:not empty”
else
echo “name:empty”
fi
2、文件测试:用于测试文件的各种属性。
[ -f $file ] 名为$file的文件是否存在
[ -r $file ] 名为$file的文件是否存在并可读
[ -w $file ] 名为$file的文件是否存在并可写
[ -x $file ] 名为$file的文件是否存在并可执行
[ -s $file ] 名为$file的文件是否存且大小不为0
[ -d $file ] 名为$file的目录是否存在
以上测试条件中,文件名可以是字符串也可以是变量。
在判断条件之间加!号,其意义与以上相反,如:
[ ! -f $file ] 以变量$file的值为名的文件是否不存在。
[ ! -r /unix ] 名为unix的文件是否不存在或不可读。
举例:if [ -f /tmp/test ]
then
echo “file /tmp/test:exist”
else
ehco “file /tmp/test:not exist”
fi
3、数值测试:若字符串由数字组成,则可进行数值测试。
[ string1 -eq string2 ] 数字string1是否等于数字string2
[ string1 -ne string2 ] 数字string1是否不等于数字string2
[ string1 -lt string2 ] 数字string1是否小于数字string2
[ string1 -le string2 ] 数字string1是否小于等于数字string2
[ string1 -gt string2 ] 数字string1是否大于数字string2
[ string1 -ge string2 ] 数字string1是否大于等于数字string2
其中,string1和string2可以是数字值或为数字的变量。
例如:if [ $No1 -eq $No2 ]
then
echo “$No1 equal $No2”
else
echo “$No1 not equal $No2”
fi
以上三种测试返回0时为真,非0值为假。此外在测试条件中,还可以配合逻辑运算符作各种情况的测试,Shell提供下列逻辑运算符:
-a 或 and 逻辑与,即几个条件同时成立其结果才为真
-o 或 or 逻辑或,即几个条件中只要有一个成立结果就为真
! 或 not 逻辑非,取条件的反值
如:[ -f file1 –a –r file2 ]
表示当文件file1存在并且文件file2存在且可读的情况下,返回值才为真。
二、 trap 命令
trap命令的作用主要是信号拦截,根据使用方式,可分为以下几种:
1、来关闭一个信号(使这个信号被忽略)。
2、重新定义这个信号的动作。
3、恢复原有的缺省动作。
信号的概念:指由系统(核心)、程序或kill命令发出的,旨在通知执行程序某件事的发生,并使程序完成相应信号所对应的动作。UNIX操作系统定义了若干信号,分别对应于一个数字。其中较为常用的信号如下:
0: 退出Shell时产生,即按Ctrl-D.
1: 挂断,终端被切断时,核心将此信号发送到该终端控制的进程。
2: 中断,按Delete,Ctrl-Break,Ctrl-C时产生。
3: Quit, 控制终端的停止键被按下(Ctrl-\)。
9: 删除一个或一组进程。
15: 软件结束(中断)信号。通常由kill命令传出。
使用方法:
忽略信号的命令格式为: trap “” 信号序列
重新定义信号动作的命令格式为: trap 命令序列 信号序列
恢复信号原有缺省动作的格式为: trap 信号序列
其中,命令序列可以是一个或若干个命令甚至函数,不能为空。
如:’clear;exit’
信号序列是由一个或若干个中断号组成,中断号之间以空格分开。
如:1 2 3 5
先将trap三种格式的使用方法和结果分述如下:
1、trap “” 信号序列:在程序头加上次种格式的trap命令,将
使程序忽略程序执行中收到的信号序列中的信号,它使系统中定义的该信号
对应的动作变为空。
2、trap 命令序列 信号序列:在程序头使用此种格式的trap命令,
将使程序在接收到的信号序列中的信号时,去执行命令序列中的命令,它使
系统中定义的该信号对应的动作改变为命令序列中的命令。
3、trap 信号序列:此种格式将恢复系统定义的信号序列中各信号
所对应的缺省动作值,也就是将1、2两种命令设定的动作改回缺省值。
Trap 命令经常用于程序被中断时删除临时文件。
如:trap ‘rm /tmp/linshifile;clear;exit’ 2
如希望程序在执行时不被“骚扰”,则可用:trap “” 命令序列
如:trap “” 1 2 3 15
则系统或者其它用户kill命令发出的1、2、3、15等信号将无法中
断该程序的执行,但信号9将无法拦截。
十一、Here 文件
Here文件实质上是一种重定向的应用。它允许你将一小段数据放在Shell文件中,通过转向符将这些数据转向给某个命令。Here文件的这种功能对于某些命令的自动执行起着非常重要的作用。
通常将数据用一个特殊的字符串(分界符)“括“起来,命令执行时,Shell从程序段中读取所需的值。例如vi编辑一个文本进行某些替换工作,可以建立Here文件的方式由程序自动完成。
Vi myfile<
:g/teacher/s//student/g
:x
END
其中,输入行“:g/teacher/s//student/g和:x被分解符“END”括住,执行时,输入行被逐个转向给vi命令,直到又遇到一个分解符”END”才结束。从而自动完成操作。分解符可自由定义,可以是一个字符或字符串,经常用的有!和END。
某些数值计算expr不能胜任时,可以调用unix的计算器bc:
b=324000.33
sum=`bc<
$b+145.66
END`