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 4月 17 14:41 first_shell.sh
drwxr-xr-x. 2 root root 6 4月 18 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 4月 18 13:39 file1
-rw-r--r--. 1 root root 6 4月 18 13:40 file2
-rwxr-xr-x. 1 root root 70 4月 17 14:41 first_shell.sh
drwxr-xr-x. 2 root root 6 4月 18 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 4月 18 13:40 dir1
-rw-r--r--. 1 root root 0 4月 18 13:39 file1
-rw-r--r--. 1 root root 6 4月 18 13:40 file2
-rwxr-xr-x. 1 root root 70 4月 17 14:41 first_shell.sh
drwxr-xr-x. 2 root root 19 4月 18 13:43 test1
lrwxrwxrwx. 1 root root 5 4月 18 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 4月 18 13:40 dir1
-rw-r--r--. 1 root root 6 4月 18 13:40 file2
-rwxr-xr-x. 1 root root 70 4月 17 14:41 first_shell.sh
drwxr-xr-x. 2 root root 19 4月 18 13:43 test1
lrwxrwxrwx. 1 root root 5 4月 18 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 4月 18 13:40 dir1
-rw-r--r--. 1 root root 6 4月 18 13:40 file2
-rwxr-xr-x. 1 root root 70 4月 17 14:41 first_shell.sh
drwxr-xr-x. 2 root root 19 4月 18 13:43 test1
lrwxrwxrwx. 1 root root 5 4月 18 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 4月 17 15:09 1.sh
-rw-r--r--. 1 root root 9 4月 17 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 4月 15 17:43 11.txt
-rw-r--r--. 1 root root 385 4月 15 17:34 2.txt
-rw-r--r--. 1 root root 0 4月 20 16:09 file1
-rw-r--r--. 1 root root 22 4月 15 20:05 file2
-rw-r--r--. 1 root root 2198 4月 15 14:13 passwd
drwxr-xr-x. 4 root root 79 4月 18 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
上一次登录:一 4月 15 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. 逻辑运算符总结
- 符号 ; 和 && 和 || 都可以用来分割命令或者表达式
- 分号( ; )完全不考虑前面的语句是否正确执行,都会执行分号后面的内容
- &&符号,需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然
- || 符号,需要考虑 || 前面的语句的非正确性,前面语句执行错误才会执行 || 后的内容;反之亦然
- 如何 && 和 || 一起出现,从左往右一次看,按照以上原则