Shell脚本---条件判断

1. 条件判断语法结构

思考:何为真(True)?何为(False)?

  • 格式1:test 条件表达式
  • 格式2:[ 条件表达式 ]
  • 格式3:[[ 条件表达式 ]] 支持正则 =~

特别说明:
1)[ 中括号两边都有空格 ]
2)[[ 中括号两边都有空格 ]]
3) 更多判断, man test 去查看,很多的参数都用来进行条件判断

2. 条件判断相关参数

问:你要判断什么?
答:我要判断文件类型,判断文件新旧,判断字符串是否相等,判断权限等…

2.1 判断文件类型

判断参数含义
-e判断文件是否存在(任何类型文件)
-f判断文件是否存在并且是一个普通文件
-d判断文件是否存在并且是一个目录
-L判断文件是否存在并且是一个软连接文件
-b判断文件是否存在并且是一个块设备文件
-S判断文件是否存在并且是一个套接字文件
-c判断文件是否存在并且是一个字符设备文件
-p判断文件是否存在并且是一个命令管道文件
-s判断文件是否存在并且是一个非空文件(有内容)

示例:

[root@localhost shello1]# ll
总用量 4
-rwxr-xr-x. 1 root root 70 417 14:41 first_shell.sh
drwxr-xr-x. 2 root root  6 418 13:34 test1
[root@localhost shello1]# touch file1
[root@localhost shello1]# echo hello > file2
[root@localhost shello1]# ll
总用量 8
-rw-r--r--. 1 root root  0 418 13:39 file1
-rw-r--r--. 1 root root  6 418 13:40 file2
-rwxr-xr-x. 1 root root 70 417 14:41 first_shell.sh
drwxr-xr-x. 2 root root  6 418 13:34 test1
[root@localhost shello1]# mkdir dir1
[root@localhost shello1]# test -e ./file1
[root@localhost shello1]# echo $?
0
[root@localhost shello1]# test -e ./test1/
[root@localhost shello1]# echo $?
0
[root@localhost shello1]# test -e ./test1/
[root@localhost shello1]# echo $?
0
[root@localhost shello1]# test -e ./test2
[root@localhost shello1]# echo $?
1
[root@localhost shello1]# [ -d ./dir1/ ];echo $?
0
[root@localhost shello1]# [ -d ./file1/ ];echo $?
1
[root@localhost shello1]# ln -s file1 test2
[root@localhost shello1]# ll
总用量 8
drwxr-xr-x. 2 root root  6 418 13:40 dir1
-rw-r--r--. 1 root root  0 418 13:39 file1
-rw-r--r--. 1 root root  6 418 13:40 file2
-rwxr-xr-x. 1 root root 70 417 14:41 first_shell.sh
drwxr-xr-x. 2 root root 19 418 13:43 test1
lrwxrwxrwx. 1 root root  5 418 13:44 test2 -> file1
[root@localhost shello1]# [ -L ./test2 ];echo $?
0
[root@localhost shello1]# rm -rf file1
[root@localhost shello1]#
[root@localhost shello1]# ll
总用量 8
drwxr-xr-x. 2 root root  6 418 13:40 dir1
-rw-r--r--. 1 root root  6 418 13:40 file2
-rwxr-xr-x. 1 root root 70 417 14:41 first_shell.sh
drwxr-xr-x. 2 root root 19 418 13:43 test1
lrwxrwxrwx. 1 root root  5 418 13:44 test2 -> file1
[root@localhost shello1]# [ -L ./test2 ];echo $?
0
[root@localhost shello1]# [[ -f ./file2 ]];echo $?
0
[root@localhost shello1]# ll
总用量 8
drwxr-xr-x. 2 root root  6 418 13:40 dir1
-rw-r--r--. 1 root root  6 418 13:40 file2
-rwxr-xr-x. 1 root root 70 417 14:41 first_shell.sh
drwxr-xr-x. 2 root root 19 418 13:43 test1
lrwxrwxrwx. 1 root root  5 418 13:44 test2 -> file1
[root@localhost shello1]# [[ -f ./test2 ]];echo $?
1

2.2 判断文件权限

判断参数含义
-r当前用户对其是否可读
-W当前用户对其是否可写
-x当前用户对其是否可执行
-u是否有suid,高级权限冒险位
-g是否有sgid,高级权限强制位
-k是否t位,高级权限粘滞位

示例:

[root@localhost shell01]# ll
总用量 8
-rwxr-xr-x. 1 root root 114 417 15:09 1.sh
-rw-r--r--. 1 root root   9 417 16:24 ip.txt
[root@localhost shell01]# test -r 1.sh;echo $?
0

2.3 判断文件新旧

说明:这里的新旧指的是文件的修改时间

判断参数含义
file1 -nt file2比较file1是否比file2新
file1 -ot file2比较file1是否比file2旧
file1 -et file2比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode

示例:

[root@localhost tmp]# ll
总用量 16
-rw-r--r--. 1 root root   12 415 17:43 11.txt
-rw-r--r--. 1 root root  385 415 17:34 2.txt
-rw-r--r--. 1 root root    0 420 16:09 file1
-rw-r--r--. 1 root root   22 415 20:05 file2
-rw-r--r--. 1 root root 2198 415 14:13 passwd
drwxr-xr-x. 4 root root   79 418 13:45 shello1
[root@localhost tmp]# test file1 -nt file2;echo $?
0
[root@localhost tmp]# test file1 -ot file2;echo $?
1
[root@localhost tmp]# test file2 -ot file1;echo $?
0
[root@localhost tmp]# [ file1 -ef file2 ];echo $?
1
[root@localhost tmp]# cat file2
heima itcast
999
ooo
[root@localhost tmp]# cat file1
hello

2.4 判断整数

判断参数含义
-eq相等
-ne不相等
-gt大于
-lt小于
-ge大于等于
-le小于等于

示例:

[root@localhost tmp]# [ 1 -eq 2 ];echo $?
1
[root@localhost tmp]# [ 1 -ne 2 ];echo $?
0
[root@localhost tmp]# [ 1 -le 2 ];echo $?
0

2.5 判断字符串

判断参数含义
-z判断是否为空字符串,字符串长度为0则成立
-n判断是否为非空字符串,字符串长度不为0则成立
string1=string2判断字符串是否相等
string1=!string2判断字符串是否不相等

示例:

[root@localhost tmp]# test -z "hello";echo $?
1
[root@localhost tmp]# test -n "hello";echo $?
0
[root@localhost tmp]# test -n " ";echo $?
0
[root@localhost tmp]# test -n "";echo $?
1
[root@localhost tmp]# test -z "";echo $?
0
[root@localhost tmp]# test "hello" = "wold";echo $?
1
[root@localhost tmp]# test "hello" != "wold";echo $?
0

2.6 多重条件判断

判断符号含义举例
-a 和 &&逻辑与[ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ]
-o 和 ||逻辑或[ 1 -eq 1 -o 1 -ne 1 ] [ 1 -eq 1 ]

特别说明:
&& 前面的表达式为真,才会执行后面的代码
|| 前面的表达式为假,才会执行后面的代码
; 只用于分割命令和表达式

数值比较示例:

[root@localhost tmp]# id -u
0
[root@localhost tmp]# [ $(id -u) -eq 0 ] && echo "admin"
admin
[root@localhost tmp]# su - aileen
上一次登录:一 415 22:06:54 CST 2024:0 上
[aileen@localhost ~]$ [ $(id -u) -eq 0 ] && echo "admin"
[aileen@localhost ~]$ [ $(id -u) -eq 0 ] || echo "is not admin"
is not admin
[aileen@localhost ~]$ id -u
1000
[aileen@localhost ~]$ [ $(id -u) -eq 0 ] && echo "admin" || echo "is not admin"
is not admin
[aileen@localhost ~]$ exit
登出
[root@localhost tmp]#  [ $(id -u) -eq 0 ] && echo "admin" || echo "is not admin"
admin
[root@localhost tmp]# [ 1 -eq 2 ] && echo AAA || echo BBB && echo CCC
BBB
CCC
[root@localhost tmp]# [ 1 -eq 2 ] || echo AAA && echo BBB && echo CCC
AAA
BBB
CCC

类C风格的数值比较示例:

注意:在 (( )) 中,= 表示赋值;== 表示判断

[root@localhost tmp]# (( 1==1 ));echo $?
0
[root@localhost tmp]# (( 1>=1 ));echo $?
0
[root@localhost tmp]# (( 1>=2 ));echo $?
1
[root@localhost tmp]# (( 1=2 ));echo $?
-bash: ((: 1=2 : 尝试给非变量赋值 (错误符号是 "=2 ")
1
[root@localhost tmp]# (( A1=2 ));echo $?
0
[root@localhost tmp]# echo $A1
2
[root@localhost tmp]# ((1!=2 ));echo $?
0
[root@localhost tmp]# ((1!==2 ));echo $?
-bash: ((: 1!==2 : 语法错误: 期待操作数 (错误符号是 "=2 ")
1
[root@localhost tmp]# ((1>2 ));echo $?
1

字符串比较示例:

注意:双引号引起来,看作一个整体; = 和 == 在 [ 字符串 ] 比较中都表示判断

[root@localhost tmp]# A=hello;B=world;[ "$A" = "$B" ];echo $?
1
[root@localhost tmp]# A=hello;B=world;[ "$A" != "$B" ];echo $?
0
[root@localhost tmp]# A=hello;B=world;[ "$A" == "$B" ];echo $?
1

3. 判断符号 [ ] 和 [[ ]] 的区别

[root@localhost tmp]# A=
[root@localhost tmp]# echo $A

[root@localhost tmp]# test "$A" = "hello"; echo $?
1
[root@localhost tmp]# [ $A = hello ];echo $?
-bash: [: =: 期待一元表达式
2
[root@localhost tmp]# [ "$A" = "hello" ];echo $?
1
[root@localhost tmp]# [[ $A = hello ]];echo $?
1

4. 逻辑运算符总结

  • 符号 ; 和 && 和 || 都可以用来分割命令或者表达式
  • 分号( ; )完全不考虑前面的语句是否正确执行,都会执行分号后面的内容
  • &&符号,需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然
  • || 符号,需要考虑 || 前面的语句的非正确性,前面语句执行错误才会执行 || 后的内容;反之亦然
  • 如何 && 和 || 一起出现,从左往右一次看,按照以上原则
  • 30
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值