您的位置:首页 > 运维架构 > Shell

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

2015-01-08 09:57 405 查看
--------------------------------------------------------

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

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

条件测试

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

Bash 中允许测试两种类型的条件:

命令成功或失败,表达式为真或假

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

状态变量$? 中保存命令退出状态的值
[root@p ~]# grep  pan1  /etc/passwd
pan1: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 -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


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

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

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

==、!=、>、>=、<、<=

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

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

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

--------------------------------------------------------
逻辑测试

[expr1
-a
expr2 ]


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

[expr1
-o
expr2 ]


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

[!
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 1 && $name
= To? ]];echo $?

0

--------------------------------------------------------
检查空值



[ "$name" = ""
]

[ ! "$name" ]

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

--------------------------------------------------------
文件测试

-f
fname


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文件测试
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: