1. 条件判断语法结构
1.1. 语法格式
-
格式1:
test
条件表达式# chen @ localhost in /root [16:26:25] $ test "hello" = "hi" && echo "=" || echo "!=" !=
-
格式2:[ 条件表达式 ]
# chen @ localhost in /root [16:28:35] $ [ "$a" = "$b" ] && echo "=" || echo "!=" !=
-
格式3:[[ 条件表达式 ]] 支持正则
# chen @ localhost in /root [16:21:04] C:1 $ [[ "$a" == "$b" ]] && echo "=" || echo "!=" !=
注意!!!
- [[]] 与 []两边最好都保持空格,[[]] 是两边一定要有空格进行隔离
- [ ] [[ ]] 区别
[[]]
支持&&
、||
,[[]]
逻辑运算符, 同时支持逻辑短路,而[]
不支持。[]
支持的逻辑运算符为-a
、-o
、!
,此处-a
、-o
相当于是test
命令的一个参数,不能使用&&、||
# chen @ localhost in /root [16:34:28] $ [ "$a" = "$b" -o -n "$a" ] && echo "hi" || echo "bye" hi # chen @ localhost in /root [16:34:40] $ [ "$a" = "$b" || -n "$a" ] && echo "hi" || echo "bye" [: ']' expected zsh: -n: 未找到命令... zsh: command not found: -n bye
[]
是命令,故在其中的变量引用或常量,需使用双引号或者单引号括起来,因为会出现单词分割现象[[]]
支持正则表达式的匹配。[[]]
为一个keyword,同括号与表达式中间必须要有空格进行隔离- 数值大小比较时在
[]
中进行比较,要使用-lt
、-gt
这样的比较符,不能使用<
、>
# chen @ localhost in ~/Shell [16:44:33] $ [ 1 > 2 ] && echo "true" || echo "false" true # chen @ localhost in ~/Shell [16:46:15] $ [ 1 \> 2 ] && echo "true" || echo "false" zsh: condition expected: > false # chen @ localhost in ~/Shell [16:46:23] $ [ 1 -gt 2 ] && echo "true" || echo "false" false # chen @ localhost in ~/Shell [16:46:36] $ [[ 1 > 2 ]] && echo "true" || echo "false" false
1.2. 相关参数
1.2.1. 判断文件类型
-[e] 判断文件是否存在
-[f] 判断文件是否存在并且是一个普通文件
-[d] 判断文件是否存在并是一个目录
-[L] 判断文件是否存在并且是一个软链接文件
-[b] 判断文件是否存在并且是一个快设备文件
-[S] 判断文件是否存在并且是一个套接字文件
-[c] 判断文件是否存在并且是一个字符设备文件
-[p] 判断文件是否存在并且是一个命名管道文件
-[s] 判断文件是否存在并且是一个非空文件
1.2.2. 判断文件权限
-[r] 当前用户对其是否可读
-[w] 当前用户对其是否可写
-[x] 当前用户对其是否可执行
1.2.3. 判断文件新旧
file1 -nt file2:比较file1是否比file2新
file1 -ot file2:比较file1是否比file2旧
file1 -ef file2:比较是否为同一文件,或者用于判断硬链接是否指向同一个为 inode
1.2.4. 判断整数
-[eq] 相等
-[ne] 不等
-[gt] 大于
-[lt] 小于
-[ge] 大于等于
-[le] 小于等于
1.2.5. 判断字符串
-[z] 判断是否为空字符串,字符串长度为0则成立
-[n] 判断是否为非空字符串,字符串长度不为0则成立
str1 = str1 判断字符串是否相等
str1 != str1 判断字符串是否不等
1.2.6. 多重条件判断
-
判断符号
-a 和 &&
逻辑与
-o和 ||
逻辑或# chen @ localhost in /root [16:21:04] C:1 $ [[ "$a" == "$b" ]] && echo "=" || echo "!=" !=
-
类 c 风格的数值比较
# chen @ localhost in /root [16:14:23] C:2 $ (( 1== 2)); echo $? 1 # chen @ localhost in /root [16:17:17] $ (( 1 < 2)); echo $? 0 # chen @ localhost in /root [16:18:33] $ (( `id -u` == 0 )); echo $? 1 # chen @ localhost in /root [16:18:56] $ a=hello;b=hi