xie-wen-hui
船帆虽小,却也能远航!

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 
逻辑比较可用:&& || !


posted on 2021-01-17 14:21  xie-wen-hui  阅读(436)  评论(0)    收藏  举报