Chinaunix首页 | 论坛 | 博客
  • 博客访问: 261657
  • 博文数量: 93
  • 博客积分: 3001
  • 博客等级: 中校
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-11 13:20
文章分类

全部博文(93)

文章存档

2011年(1)

2009年(92)

我的朋友

分类: LINUX

2009-07-11 18:04:37

单方括号的test命令  通常用内置的test命令来测试表达式的值,test命令也被链接到方括号上。这样,既可以使用单独的test命令,也可以通过把表达式用单方括号括起来,来测试表达式的值。在用test命令或方括号测试表达式时,表达式中的shell元字符不会被扩展。由于要对变量进行单词分离,因此包含空白符的字符串必须用引号括起来(参见范例14-16)

双方括号的test命令  2.xbash中,用双方括号 [[  ]](内置的test复合命令)来测试表达式的值,其中,对变量不进行单词分离,但可以通过元字符扩展进行模式匹配。包含空白符的字符串必须用引号括起来。如果一个字符串(不管含不含空白符)仅仅是在表达式中作为一个普通字符串,而不是一个模式的一部分,则它也必须用引号括起来。逻辑操作符&&()| | ()代替了与test命令一起使用的-a-o选项(参见范例14-17)

范例14-16

(test命令)

(命令行)

1   $ name=Tom

2   $ grep "$name" /etc/passwd

3   $ echo $?

4   $ test $name != Tom

5   $ echo $?

    1              # Failure

6   $ [ $name = Tom ]      # Brackets replace the test command

7   $ echo $?

    0

8   $ [ $name = [Tt]?? ]

    $ echo $?

     1

9   $ x=5

    $ y=20

10   $ [ $x -gt $y ]

    $ echo $?

    1

11  $ [ $x -le $y ]

    $ echo $?

    0

说明

1. 变量name被赋值为字符串Tom

2. grep命令在文件passwd中查找字符串Tom

3. 变量包含shell执行的上一条命令的退出状态,本例中是grep命令的退出状态。如果grep成功地找到了字符串Tom,就返回退出状态0。这条grep命令执行成功。

4. test命令可用于测试字符串和数字,也可用来执行文件测试。和所有的命令一样,test也会返回一个退出状态:退出状态为0,则表达式为真,退出状态为1,则表达式为假。表达式的等号两侧必须有空格。这条命令测试name的值是否等于Tom

5. 测试失败,test返回的退出状态为1

6. 方括号是test命令的另一种表示方式。第一个方括号后面必须跟空格。这里的表达式测试变量name的值是否为字符串TomBash中既可以使用单等号来测试字符串是否相等,也可以使用双等号来进行测试。

7. test的返回值是0。因为变量name的值等于Tom,所以test执行成功。

8. test命令不允许通配符展开。由于问号被当作一个普通字符,因此test执行失败,Tom[Tt]??不相等。返回状态为1,表示该表达式测试失败。

9. xy赋数值。

10. test命令使用数值关系操作符进行测试。本例中,test命令检测$x是否大于$y,如果是则返回0,否则,返回1(见表14-3)

11. test命令检测$x是否小于或等于$y,如果是则返回0,否则,返回1

14-3 test命令操作符

   

字符串测试

[ string1 = string2 ]

string1等于string2(=两侧必须有空格)

[ string1= = string2 ]

string1等于string2(2.xbash中可以用单等号=代替)

[ string1 != string2 ]

string1不等于string2(!=两侧必须有空格)

[ string ]

string不为空

[ -z string ]

string的长度为0

[ -n string ]

string的长度不为0

[ -l string ]

string的长度(字符数)

例如:         test –n $word   [ -n $word ]

           test tom = sue  [ tom = sun ]

逻辑测试

[ string1 –a string2 ]

string1string2都为真

[ string1 –o string2 ]

string1string2至少有一个为真

[ !string1 ]

字符串不匹配

逻辑测试(复合命令)

[[ pattern1 && pattern2 ]]

pattern1pattern2都为真

[[ pattern1 || pattern2 ]]

pattern1pattern2至少有一个为真

[[ !pattern1 ]]

模式不匹配

整数测试

[ int1 –eq int2 ]

int1等于int2

[ int1 –ne int2 ]

int1不等于int2

[ int1 –gt int2 ]

int1大于int2

[ int1 –ge int2 ]

int1大于或等于int2

[ int1 –lt int2 ]

int1小于int2

[ int1 –le int2 ]

int1小于或等于int2

用于文件测试的二进制操作符

[ file1 –nt file2 ]

如果文件file1file2新则为真(根据修改时间)

[ file1 –ot file2 ]

如果文件file1file2老则为真

[ file1 –ef file2 ]

如果文件file1file2有相同的设备数或i结点数则为真

范例14-17

(复合的test命令)(bash2.x)

   $ name=Tom; friend=Joseph

1   $ [[ $name == [Tt]om ]]      # Wildcards allowed

    $ echo $?

    0

2   $ [[ $name == [Tt]om && $friend == "Jose" ]]

    $ echo $?

    1

3   $ shopt -s extglob           # Turns on extended pattern matching

4   $ name=Tommy

5   $ [[ $name == [Tt]o+(m)y ]]

    $ echo $?

    0

说明

1. 如果使用复合的test命令,在字符串测试中可以使用shell元字符。本例中的表达式将进行字符串相等测试,看变量name是否匹配于Tomtomtommy等。表达式为真,则退出状态(?)0

2. 逻辑操作符&&() | | ()可以与复合的test命令一起使用。如果是&&操作,两边的表达式必须都为真,如果第一个表达式测试为假,则不再进行进一步测试。而对于| |逻辑操作符,两个表达式中有一个为真即可,如果第一个表达式测试为真,则不再进行进一步测试。注意:“Jose”是被引号括起来的,如果不使用引号,则是测试变量friend是否包含模式JoseJoseJoseph都满足条件。这里第二个条件非真,表达式测试为假,退出状态为1

3. 用内置的shopt命令打开扩展的模式匹配开关。

4. 变量name被赋值为Tommy

5. 测试表达式是否相等,包含模式匹配元字符。测试变量name是否匹配于一个字符串:它以字母Tt开头、后跟字母o、接着是一个或多个字母m,最后跟字母y

后面的范例将说明如何使用内置的test命令、带单方括号的test命令,以及带双方括号的复合命令来测试退出状态。

let命令和带双圆括号的算术运算  虽然test命令可以计算算术表达式的值,但读者可能更愿意使用let命令,因为let命令带有丰富的类C操作符(bash 2.x)let命令可以将表达式包含在一组圆括号中来表达不同的含义。

不管使用的是test命令、复合命令还是let命令,表达式的结果都会被测试。返回零表示成功,而返回非零状态表示失败(参见表14-4)

14-4  let命令操作符

   

   

-

+

!

~

*

/

%

+

-

负号

正号

逻辑非

按位取反

乘法

除法

余数

加法

减法

                                     (续表)  

   

   

<< 

>> 

<= >= < >

== !=

&

^

|

&&

| |

= *= /= %= += -= <<= >>= &= ^= |=

按位左移

按位右移

关系运算符

相等、不相等

按位与操作

按位异或操作

按位或操作

逻辑与

逻辑或

赋值、快捷赋值运算符

范例14-18说明了let命令中如何使用双圆括号。

范例14-18

(let命令)(bash2.x)

(命令行)

1   $ x=2

    $ y=3

2   (( x > 2 ))

    echo $?

    1

3   (( x < 2 ))

    echo $?

    0

4   (( x == 2 && y == 3 ))

    echo $?

    0

5   (( x > 2 || y < 3 ))

    echo $?

    1

说明

1. xy赋值。

2. 双圆括号代替let命令来测试数值表达式。如果xy大,退出状态为0。由于条件不满足,因此退出状态为1。变量 ? 包含上一条执行命令的退出状态,这里是(( ))命令的退出状态。注意,括在(( ))中的变量不需要使用美元符$

3. 用双圆括号测试表达式。如果x小于2,则返回退出状态0,否则,返回1

4. 测试复合表达式:如果x等于2y等于3(即两个表达式都为真),则退出状态返回0,否则,返回1

5. 测试复合表达式:如果x大于2y小于3(即有一个表达式为真),则退出状态返回0,否则,返回1

 

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

上一篇:历史命令操作

下一篇:位置参量

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