shell系统学习(1)--文件判断,字符串,数字比较
1.文件判断
shell中有专门对文件的状态属性进行判断的测试运算符,主要有以下几个
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
常用的参数:
案例:
[root@linuxnode1 ~]# [ -f red.sh1 ] && echo 1 || echo 0
0
[root@linuxnode1 ~]# [ -f deploy ] && echo 1 || echo 0
1
[root@linuxnode1 ~]# [ -d deploy ] && echo 1 || echo 0
0
[root@linuxnode1 ~]# [ -x deploy ] && echo 1 || echo 0
0
[root@linuxnode1 ~]# [ -x input.sh ] && echo 1 || echo 0
1
[root@linuxnode1 ~]# [ -s input.sh ] && echo 1 || echo 0
1
[root@linuxnode1 ~]# [ -e input.sh ] && echo 1 || echo 0
1
[root@linuxnode1 ~]# [ ! -s input.sh ] && echo 1 || echo 0
0
2、整数值比较
[ num1 选项 num2 ]
例如:[ 2 -eq 2 ] 或者用变量[ $a -eq $b ]
(1) -eq 等于
(2) -ne 不等于
(3) -gt 大于
(4) -ge 大于等于
(5) -lt 小于
(6) -le 小于等于
例:
[root@linuxnode1 ~]# [ 1 -eq 2 ]&& echo 1 || echo 0
0
[root@linuxnode1 ~]# [ 1 -eq 1 ]&& echo 1 || echo 0
1
[root@linuxnode1 ~]# [ 1 -lt 1 ]&& echo 1 || echo 0
0
[root@linuxnode1 ~]# [ 1 -le 1 ]&& echo 1 || echo 0
1
用(()) [[]]测试
[root@linuxnode1 ~]# (( 3 >2 ))&& echo 1 || echo 0
1
[root@linuxnode1 ~]# (( 3 <2 ))&& echo 1 || echo 0
0
[root@linuxnode1 ~]# [[ 3 <2 ]]&& echo 1 || echo 0
3、字符比较
[ "string字串1" 选项 "string字串2" ]
例如:[ $name == "jim" ]
注意:选项和字串两边有空格!!!!字符一定用双引号引住。
(1) == 相等 相等为真
(2) != 不相等 不相等为真 0
(3) -z 空 空为真
(4) !-z 非空 非空为真
例:
[root@linuxnode1 ~]# [ "abc" == "bcd" ]&& echo 1 || echo 0
0
[root@linuxnode1 ~]# [ "abc" != "bcd" ]&& echo 1 || echo 0
1
[root@linuxnode1 ~]# [ -z "bcd" ]&& echo 1 || echo 0
0
[root@linuxnode1 ~]# [ ! -z "bcd" ]&& echo 1 || echo 0
1
[root@linuxnode1 ~]# [ -n "bcd" ]&& echo 1 || echo 0
1
4、逻辑判断:(两个或两个以上判断条件时使用逻辑比较)
(1) 逻辑 与:
&& 多个条件同时成立 [条件1] && [条件2]
(2) 逻辑 或:
|| 多个条件只要有一个条件成了就可以 [条件1] || [条件2]
(3) 逻辑 非 !=取反
PS:两种表达方式:
1. &&----[ 10 -gt 8 ] && [ 5 -lt 6 ] 2. -a 用法:[ 10 -gt 8 -a 5 -lt 6 ]
1. || ----[ 10 -gt 8 ] || [ 5 -lt 6 ] 2. -o 用法:[ 10 -gt 8 -0 5 -lt 6 ]
(4) 调用变量时"" 与''的区别
字符用两个都一样输出,当变量时,单引号输出字符,双引号 使用变量的功能
例如:a =10 b=10
"$a + $b"=num2 结果是 10 + 10 =num2
'$a + $b'=num2 结果是 $a + $b =num2
例:
[root@linuxnode1 ~]# [ -n "bcd" -a -f test1.yaml ]&& echo 1 || echo 0
1
[root@linuxnode1 ~]# [ -n "bcd" -a -f test3.yaml ]&& echo 1 || echo 0
0
[root@linuxnode1 ~]# [ -n "bcd" -o -f test3.yaml ]&& echo 1 || echo 0
1