Shell编程之比较判断.md
目录
一、条件判断的语法格式:
# 条件判断语法有三种:
1、语法一:
test 条件表达式
2、语法二:
[ 条件表达式 ]
# 注意:[两边要用空格隔开]
3、语法三:
[[ 条件表达式 ]]
# 注意:[[两边要用空格隔开]]
# 小提示: 可以使用man查看更多命令选项及用法,如 man test
二、条件判断的判断类型:
1、判断各类型文件是否存在:
<#> 语法:
1、test 选项 文件路径;echo $?
2、[ ];echo $?
3、[[ ]];echo $?
<#> 判断参数:
-e: 判断文件是否存在并且(任何类型文件)
-f: 判断文件是否存在并且(普通文件)
-d: 判断文件是否存在并且(目录)
-L: 判断文件是否存在并且(软连接)
-s: 判断文件是否不为空(任何类型文件)
-b: 判断文件是否存在并且(块设备文件)
-S: 判断文件是否存在并且(套接字文件)
-c: 判断文件是否存在并且(字符设备文件)
-p: 判断文件是否存在并且(命名管道文件)
<#> 代码演示:
<#> 1、test 选项 文件路径;echo $?
[root@localhost home]# ls
boy file2 file4 file6 ip.txt test test.sh
file1 file3 file5 file.txt mkdir test1.sh xwh
[root@localhost home]# test -e ./file2;echo $?
0
[root@localhost home]# test -f ./file2;echo $?
1
[root@localhost home]# test -f ./file.txt;echo $?
0
[root@localhost home]# test -d ./file.txt;echo $?
1
[root@localhost home]# test -d ./file2;echo $?
0
[root@localhost home]# test -d ./file;echo $?
1
[root@localhost home]# ln -s test.sh aaa;test -L ./aaa;echo $?
0
<#> 2、[ ];echo $?
[root@localhost home]# ls
aaa file1 file3 file5 file.txt mkdir test1.sh xwh
boy file2 file4 file6 ip.txt test test.sh
[root@localhost home]# [ -e ./file3;echo $? ]
bash: [: 缺少 `]'
2 ]
[root@localhost home]# [ -e ./file3 ];echo $?
0
[root@localhost home]# [ -f ./file3 ];echo $?
1
[root@localhost home]# [ -f ./file.txt ];echo $?
0
[root@localhost home]# [ -d ./file3 ];echo $?
0
[root@localhost home]# [ -L ./aaa ];echo $?
0
[root@localhost home]#
<#> 3、[[ ]];echo $?
[root@localhost home]# [ -L ./aaa ];echo $?
0
[root@localhost home]# [[ -e ./file3 ]];echo $?
0
[root@localhost home]# [[ -L ./aaa ]];echo $?
0
[root@localhost home]# [[ -d ./file3 ]];echo $?
0
[root@localhost home]# [[ -f ./file.txt ]];echo $?
0
[root@localhost home]#
2、判断文件权限:
<#> 语法:
<#> test 选项 文件 ;echo $?
<#> 判断参数:
-r: 当前用户对该文件是否能读
-W: 当前用户对该文件是否能写
-x: 当前用户对该文件是否能执行
-u: 是否有suid,高级权限-冒险位
-g: 是否有sgid,高级权限-强制位
-k: 是否有t位,高级权限-粘滞位
<#>小提示:冒险位、强制位、粘滞位什么含义自行百度,这里不做解释!
<#> 代码演示:
[root@localhost home]# ll
总用量 28
lrwxrwxrwx. 1 root root 7 12月 2 23:16 aaa -> test.sh
drwx------. 17 boy boy 4096 12月 2 13:24 boy
drwxr-xr-x. 12 root root 177 11月 30 13:36 file1
drwxr-xr-x. 12 root root 177 11月 30 13:36 file2
drwxr-xr-x. 12 root root 177 11月 30 13:36 file3
drwxr-xr-x. 12 root root 177 11月 30 13:36 file4
drwxr-xr-x. 12 root root 177 11月 30 13:36 file5
drwxr-xr-x. 12 root root 177 11月 30 13:36 file6
-rw-r--r--. 1 root root 12 11月 30 13:38 file.txt
-rw-r--r--. 1 root root 46 12月 1 12:07 ip.txt
-rw-r--r--. 1 root root 31 11月 30 13:45 mkdir
-rwxr-xr-x. 2 root root 222 12月 2 22:24 test
-rwxr-xr-x. 1 root root 199 11月 30 13:17 test1.sh
-rwxr-xr-x. 2 root root 222 12月 2 22:24 test.sh
drwxr-xr-x. 2 root root 159 8月 26 18:57 xwh
[root@localhost home]# [ -w test.sh ];echo $?
0
[root@localhost home]# [ -x test.sh ];echo $?
0
[root@localhost home]# [ -r test.sh ];echo $?
0
3、判断文件新旧(文件最后一次的修改时间)
<#> 语法:
file1 -nt file2 # 判断 file1 是不是比 file2 新
file1 -ot file2 # 判断 file1 是不是比 file2 旧
file1 -ef file2 # 判断 file1 与file2是否为同一文件,也可判断硬链接是否指向同一个inode
<#> 代码演示:
<#> file1 -ef file2 # 判断 file1 与file2是否为同一文件,也可判断硬链接是否指向同一个inode
[root@localhost home]# ls
boy file2 file4 file6 ip.txt test.sh
file1 file3 file5 file.txt mkdir xwh
[root@localhost home]# cp test.sh test1.sh
[root@localhost home]# ls
boy file2 file4 file6 ip.txt test1.sh xwh
file1 file3 file5 file.txt mkdir test.sh
[root@localhost home]# ln -s test.sh aaa;[ -L ./aaa ];echo $?
0
[root@localhost home]# [ aaa -ef test.sh ];echo $?
0
[root@localhost home]# [ test.sh -ef test1.sh ];echo $?
1
[root@localhost home]# ln -s test1.sh bbb;[ -L ./bbb ];echo $?
0
[root@localhost home]# ln -s test1.sh bbb;[ -L ./bbb ];[ bbb -ef aaa ];echo $?
ln: 无法创建符号链接"bbb": 文件已存在
1
[root@localhost home]# ls
aaa boy file2 file4 file6 ip.txt test1.sh xwh
bbb file1 file3 file5 file.txt mkdir test.sh
[root@localhost home]# rm -rf bbb
[root@localhost home]# ln -s test1.sh bbb;[ -L ./bbb ];[ bbb -ef aaa ];echo $?
1
<#> file1 -nt file2 # 判断 file1 是不是比 file2 新
file1 -ot file2 # 判断 file1 是不是比 file2 旧
[root@localhost home]# touch file
[root@localhost home]# touch file1
[root@localhost home]# [ file -ot file1 ];echo $?
0
[root@localhost home]# [ file -nt file1 ];echo $?
1
[root@localhost home]# [ file1 -nt file ];echo $?
0
4、判断整数之间的大小
<#> 语法:
test n1 参数 n2;echo $?
<#> 判断参数:
-eq: # 等于
-ne: # 不等于
-gt: # 大于
-lt: # 小于
-ge: # 大于等于
-le: # 小于等于
5、判断字符串
<#> 语法:
<#> 判断参数:
-z: # 判断该字符是否为空/长度为0
-n: # 判断该字符是否为非空/长度非0
string1 = string2 # 判断两字符串是否相等
string1 != string2 # 判断两字符串是否不相等
6、多重条件判断(重点)
<#> 逻辑运算符
或:
-a 和 &&
<#>用法:
[ 2 -ge 1 -a 3 -eq 3 ] 等同于 [ 2 -ge 1 ]&&[ 3 -eq 3 ]
<#>注意:
因为逻辑与是需要两边都true结果才返回true,所以当前半部分返回false时,后半部分是不执行的!
与:
-o 和 ||
<#>用法:
[ 3 -lt 2 -o 2 -gt 1 ] 等同于 [ 3 -lt 2 ]||[ 2 -gt 1 ]
<#>注意:
因为逻辑或只需要一边返回结果为true结果就返回true,所以当前半部分返回true时,后半部分是不执行的!
<#> 代码演示:
<#> 1、数值判断:
[boy@localhost home]$ id
uid=1000(boy) gid=1000(boy) 组=1000(boy) 环境 =unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[boy@localhost home]$ id -u
1000
[boy@localhost home]$ [$(id -u) -ne 0 -a echo 'no root' ]
bash: [1000: 未找到命令...
[boy@localhost home]$ [ $(id -u) -ne 0 -a echo 'no root' ]
bash: [: 参数太多
[boy@localhost home]$ [ $(id -u) -ne 0 ]&& echo 'no root'
no root
[boy@localhost home]$ [ $(id -u) -eq 0 ]&& echo 'no root'
[boy@localhost home]$ [ $(id -u) -eq 0 ]|| echo 'no root'
no root
<#>2、字符串判断
[boy@localhost home]$ name1=lao wang;name2=lao zhang;[ $name1 != $name2 ];echo $?
bash: wang: 未找到命令...
bash: zhang: 未找到命令...
0
[boy@localhost home]$ name1='lao wang';name2='lao zhang';[ $name1 != $name2 ];echo $?
bash: [: 参数太多
2
[boy@localhost home]$ name1='lao wang';name2='lao zhang';[ '$name1' != '$name2' ];echo $?
0
[boy@localhost home]$ name1="lao wang";name2="lao zhang";[ "$name1" != "$name2" ];echo $?
0
[boy@localhost home]$ name1='lao wang';name2='lao zhang';[ "$name1" != "$name2" ];echo $?
0
[boy@localhost home]$ name1='lao wang';name2='lao zhang';[ '$name1' 1= '$name2' ];echo $?
bash: [: 1=: 期待二元表达式
2
<#> 总结:
1、字符串比较判断时,字符串用''和”“都可以,但是字符串变量的调用时只能用"",所以建议用引号都使用双引号""!
总结(条件判断):
<#> 条件判断语法:
1、test 表达式
2、[ 表达式 ]
3、[[ 表达式 ]]
<#> 判断参数:
一、文件
1、各类型文件是否存在
-e 判断文件是否存在并且(任何类型文件)
-f 判断文件是否存在并且(文本文档类型)
-d 判断文件是否存在并且(文件夹或目录)
-s 判断文件内容是否不为空并且(任何文件类型)
-L 判断文件是否存在并且(软连接)
2、文件权限
-r 是否有读权限
-w 是否有写权限
-x 是否有执行权限
-u 是否有冒险权位限
-g 是否有强制位权限
-k 是否有粘滞位权限
3、文件新旧
1、file1 -nt file2 file1 是不是比 file2 新
2、file1 -ot file2 file1 是不是比 file2 旧
3、file1 -ef file2 file1 是不是和 file2 为同一文件(同一文件建立的不同软连接文件作判断时是true)
二、整数
-eq 是否 =
-ne 是否!=
-gt 是否>
-lt 是否<
-ge 是否>=
-le 是否<=
三、字符串
-n 字符串是否为空
-z 字符串是否为非空
= 字符串是否相等
!= 字符串是否不相等
<#> 多重条件判断:
1、逻辑与(-a 和 &&)
[ 表达式1 -a 表达式2 ] 等同 [ 表达式1 ]&&[ 表达式2 ]
注意:
1、当表达式1=false时,表达式2不进行计算
2、当同时出现与或/&&、||时,根据运算规则从左到右运算
2、逻辑或(-o 和 ||)
[ 表达式1 -o 表达式2 ] 等同 [ 表达式1 ]||[ 表达式2 ]
注意:
1、当表达式1=true时,表达式2不进行计算
2、当同时出现与或/&&、||时,根据运算规则从左到右运算
总结:
字符串比较可用: =、!=、-n、-z
数字比较可用:< <= > >= + != ==
文件比较可用:-e -f -d -l -w -x -r -nt -ot -ef
逻辑比较可用:&& || !
浙公网安备 33010602011771号