条件判断语法
test 条件表达式
[ 条件表达式 ] #两边要有空格
[[ 条件表达式 ]] #支持正则,两边要有空格
判断文件类型
判断参数 | 含义 |
---|---|
-e | 判断文件是否存在 |
-f | 判断文件是否存在并且是一个普通文件 |
-d | 判断文件是否存在并且是一个目录 |
-L | 判断文件是否存在并且是一个软链接文件,但是不能判断是否有效 ([ -e file1 -a -L file1] ) |
-b | 判断文件是否存在并且是一个块设备文件 |
-S | 判断文件是否存在并且是一个套接字文件 |
-c | 判断文件是否存在并且是一个字符设备文件 |
-p | 判断文件是否存在并且是一个命名管道文件 |
-s | 判断文件是否存在并且是一个非空文件 |
test -e ./file1 #当前目录有没有file1文件
[ -e ./file1 ]
echo $? #上面代码执行不管有没有文件都没显示,只能这样看,0为存在,非0为不存在
[ ! -d ./dir1 ] #不存在为真
判断文件权限
判断参数 | 含义 |
---|---|
-r | 当前用户对其是否可读 |
-w | 当前用户对其是否可写 |
-x | 当前用户对其是否可执行 |
-u | 是否有suid,高级权限冒险位 |
-g | 是否有sgid,高级权限限制位 |
-k | 是否有t位,高级权限沾滞位(意思是只有文件创建者和root用户可以删除) |
test -r l.sh;echo $?
判断文件新旧(文件修改时间)
判断参数 | 含义 |
---|---|
file1 -nt file2 | 比较file1是否比file2新 |
file1 -ot file2 | 比较file1是否比file2旧 |
file1 -ef file2 | 比较是否为同一个文件(索引号相不相同),或者用于判断硬链接,是否指向同一个inode |
test file1 -nt file2;echo $?
判断整数
判断参数 | 含义 |
---|---|
-eq | 相等 |
-ne | 不等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
[1 -eq 2];echo $?
判断字符串
判断参数 | 含义 |
---|---|
-z | 判断是否为空字符串,字符串长度为0则成立,空格也是字符 |
-n | 判断是否为非空字符,字符串长度不为0则成立 |
str1 = str2 | 判断字符串是否相等 |
str1 != str2 | 判断字符串是否不相等 |
test -z 'sss';echo $?
test 'hello' = 'world';echo $?
a="hello";b="world"
[ "$a" = "$b" ];echo $? # = 和 == 在[字符串]里都表示判断
多重条件判断
判断符号 | 含义 | 举例 |
---|---|---|
-a和&& | 逻辑与 | [1 -eq 1 -a 1 -ne 0] , [1 -eq 1] && [1 -ne 0] |
-o和11 | 逻辑或 | [1 -eq 1 -o 1 -ne 1] |
&&:当前面表达式为真,才会执行后面的代码
||:当前表达式为真,就不会执行后面的代码
类C风格的数值比较
#在(())里面 == 为判断 = 为赋值
((1==2));echo $?
[] 与 [[]] 的区别
a= #空
[ $a = hello ] #报错,下面才对
[ "$a" = "hello" ]
[[ $a = hello ]] #不报错
[ 1 -eq 1 && 1 -eq 1 ] #报错,下面才是对的
[ 1 -eq 1 && 1 -eq 1 ]
[[ 1 -eq 1 && 1 -eq 1 ]] #不报错