(6)Linux ----- Shell编程条件测试 ---- ④

来源:互联网 发布:中海达v30数据怎么导出 编辑:程序博客网 时间:2024/05/18 17:02

--------------------------------------------------------

条件测试
字符串测试
整数测试
逻辑测试
文件测试

--------------------------------------------------------

条件测试

条件测试可以根据某个特定条件是否满足,来选择执行相应的任务。

Bash 中允许测试两种类型的条件:
          命令成功或失败表达式为真或假

任何一种测试中,都要有退出状态(返回值),
         退出状态为 0 表示命令成功或表达式为
 非0 则表示命令失败或表达式为

状态变量$? 中保存命令退出状态的值

[root@p ~]# grep  pan1  /etc/passwdpan1:x:501:502::/home/pan1:/bin/bash[root@p ~]# echo $?0[root@p ~]# 

--------------------------------------------------------

测试表达式的值
表达式测试包括字符串测试整数测试文件测试

--------------------------------------------------------

内置测试命令test
 
     l通常用test 命令来测试表达式的值

[root@p ~]# x=5;y=10[root@p ~]# test $x -gt $y[root@p ~]# echo $?1[root@p ~]# 

     l test 命令可以用方括号 来代替   方括号前后要留空格!
[root@panjinming ~]# x=5;y=10
You have new mail in /var/spool/mail/root
[root@panjinming ~]# [$x -gt $y]
-bash: [5: command not found
[root@panjinming ~]# [ $x -gt $y ]
[root@panjinming ~]# echo $?
1
[root@panjinming ~]# 
[root@p ~]# x=5;y=10[root@p ~]# [$x -gt $y]-bash: [5: command not found[root@p ~]# [ $x -gt $y ][root@p ~]# echo $?1[root@p ~]# 

l2.x 版本以上的Bash 中可以用双方括号来测试表达式的值,此时可以使用通配符进行模式匹配
[root@panjinming ~]# name=Tom[root@panjinming ~]# [ $name = [Tt]?? ][root@panjinming ~]# echo $?1[root@panjinming ~]# [[ $name = [Tt]?? ]][root@panjinming ~]# echo $?0[root@panjinming ~]# 

--------------------------------------------------------

字符串测试   操作符两边必须留空格!

[-z$str]

如果字符串 str 长度为0,返回真   (为0 返回假)

[-n$str]

如果字符串 str 长度为0,返回假   (不为 0 返回真)

[ $str1 = $str2]

两字符串相等

[ $str1 != $str2]

两字符串不等


[root@p ~]# name=Tom[root@panjinmin ~]# [-z $name]-bash: [-z: command not found[root@p ~]# [ -z $name ][root@p~]# echo $?1[root@p ~]# [ -n $name ][root@p ~]# echo $?0[root@p ~]# name2=Andy[root@p ~]# [ $name=$name2 ]      ## 操作符两边的空格[root@p ~]# echo $?0[root@p ~]# [ $name!=$name2 ]      ##<span style="font-family: Arial, Helvetica, sans-serif;">操作符两边的空格</span>[root@p ~]# echo $?0[root@p ~]# [ $name = $name2 ][root@p ~]# echo $?1[root@p ~]# [ $name != $name2 ][root@p ~]# echo $?0[root@panjinming ~]# 

--------------------------------------------------------

整数测试

整数测试,即比较大小    操作符两边必须留空格!

[ int1 -eqint2 ]

 int1等于int2

[ int1 -neint2 ]

 int1不等于int2

[ int1 -gtint2 ]

 int1大于int2

[ int1 -geint2 ]

 int1大于或等于int2

[ int1 -ltint2 ]

 int1小于int2

[ int1 -leint2 ]

 int1小于或等于int2


x=1; [ $x -eq ];echo $?   0

x=a; [ $x -eq ];echo $?    -bash: [: a: integer expression expected   2


整数测试也可以使用 let命令或双圆括号

        ==!=>>=<<=

x=1; let"$x==1";echo $?          0

x=1; (($x+1>=2 ));echo $?      0


两种测试方法的区别
l使用的操作符不同
let 和双圆括号中可以使用算术表达式,而中括号不能
l  let 和双圆括号中,操作符两边可以不留空格

--------------------------------------------------------

逻辑测试

[expr1-aexpr2 ]

逻辑,都为真时,结果为真

[expr1-oexpr2 ]

逻辑,有一个为真时,结果为真

[!expr ]

逻辑


x=1; name=Tom;

[  $x  -eq   1   a   –n$name  ];echo $?

0


注:不能随便添加括号

[($x-eq1)a(–n $name)];echo $?

-bash: syntax error near unexpected token `$x'


可以使用模式的逻辑测试

[[pattern1&& pattern2]]

逻辑

[[pattern1|| pattern2]]

逻辑

[[!pattern ]]

逻辑


x=1; name=Tom;

[[ $x -eq &&  $name= To? ]];echo $?

0

--------------------------------------------------------

检查空值

[  "$name"  =  ""]

[   !  "$name"  ]

[  "X${name}"="X"   ]


--------------------------------------------------------

文件测试

 -ffname

fname 存在且是普通文件时,返回真 ( 即返回0 )

 -L fname

fname 存在且是链接文件时,返回真

 -d fname

fname 存在且是一个目录时,返回真

 -e fname

fname(文件或目录)存在时,返回真

 -s fname

fname 存在且大小大于0 时,返回真

 -r fname

fname(文件或目录)存在且可读时,返回真

 -w fname

fname(文件或目录)存在且可写时,返回真

 -x fname

fname(文件或目录)存在且可执行时,返回真


--------------------------------------------------------

括号总结

括号形式

功能说明

${...}

获取变量值

$(...)

命令替换

$[...]

让无类型的变量参与算术运算

$((...))

同上

((…))

算术运算

[ ... ]

条件测试,等价于test命令

[[ ... ]]

条件测试,支持模式匹配与通配符

--------------------------------------------------------

总结 

q条件测试
q字符串测试
q整数测试
q逻辑测试
q文件测试



0 0
原创粉丝点击