Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92284445
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-18 22:55:23

 

一、     条件测试语句

 

Shell提供测试语句来测试各种条件(通常用于控制语句中)。测试语句

 以中括号[]括住测试条件,中括号前后需留有空格,几种测试条件如下:

 

1、字符串测试:用于测试两个字符串是否相等。

 

[ string1 = string2 ]    字符串string1string2是否相等

[ $name =’Johne’ ]     变量name的值是否为字符串John

[ $name = $string ]      变量name的值是否等于变量string的值

[ $string ]              变量string的值是否为空

[ -z string ]            string的长度是否为0

[ -n string ]            string的长度是否不为0

[ “string” ]           string的长度是否为0

[ string1!=string2 ]     字符串string1string2是否不相等

[ $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

 

其中,string1string2可以是数字值或为数字的变量。

例如: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 信号序列:此种格式将恢复系统定义的信号序列中各信号

所对应的缺省动作值,也就是将12两种命令设定的动作改回缺省值。

 

      Trap 命令经常用于程序被中断时删除临时文件。

      如:trap ‘rm /tmp/linshifile;clear;exit’ 2

      如希望程序在执行时不被“骚扰”,则可用:trap “” 命令序列

      如:trap “” 1 2 3 15

     则系统或者其它用户kill命令发出的12315等信号将无法中

断该程序的执行,但信号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`

阅读(417) | 评论(0) | 转发(0) |
0

上一篇:SHELL编程基础(3)

下一篇:SHELL编程基础(5)

给主人留下些什么吧!~~