条件测试:推荐使用格式2
格式1: test<测试表达式> man test查看相关帮助
格式2: [<测试表达式>]
格式3: [[<测试表达式>]]
说明:在[[]]中可以使用通配符进行模式匹配 && || > < 等操作符可以应用于[[]]中,但不能应用于[]中
[root@localhost ~]# test -f file && echo 1 || echo 0
0
[root@localhost ~]# touch file
[root@localhost ~]# test -f file && echo 1 || echo 0
1
[root@localhost ~]# test ! -f file && echo 1 || echo 0
0
[root@localhost ~]# arg="martin"
[root@localhost ~]# test -z "$arg" && echo 1 || echo 0
0
[root@localhost tools]# [ -f file ]&& echo 1 || echo 0
0
[root@localhost tools]# [[ -f file && -d dir ]]&& echo 1 || echo 0
0
文件测试操作符
-f file
-d dirrctory
-s size 文件存在且不为空则为真
-e exist 可以是文件也可以是目录
-r read
-w write
-x excute..
-L link
f1 -nt f2 newer than 若文件f1比文件f2新则为真
f1 -ot f2 older than
[root@localhost tools]# mkdir martin
[root@localhost tools]# [ -f martin ]&& echo 1 || echo 0
0
[root@localhost tools]# [ -d martin ]&& echo 1 || echo 0
1
[root@localhost tools]# [ -e martin ]&& echo 1 || echo 0
1
常用字符串测试操作符
-z "字符串" 若长度为0则为真, -z 可以理解为 zero
-n "字符串" 若长度不为0则为真, -n 可以理解为 no zero
"串1"="串2" 若串1等于串2则为真,可使用== 代替=
"串1"!="串2" 若串1不于串2则为真,但不能使用 !==代替 !=
字符串或字符串变量比较都要加双引号再比较
字符串比较,比较符号两端最好有空格,多参考系统脚本
[root@localhost tools]# sed -n '30,31p' /etc/init.d/network
# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 6
[root@localhost tools]# martin="hello"
[root@localhost tools]# [ "${martin}" = "hello" ]&& echo 1 || echo 0
1
[root@localhost tools]# [ "${martin}" = "hello123" ]&& echo 1 || echo 0
0
[root@localhost tools]# [ -n "abc" ]&& echo 1 || echo 0
1
[root@localhost tools]# [ -n "" ]&& echo 1 || echo 0
0
[root@localhost tools]# [ 12 -eq 13 ]&&echo 1 || echo 0
0
[root@localhost tools]# [ 12 -lt 13 ]&&echo 1 || echo 0
1
[root@localhost tools]# [ 12 -gt 13 ]&&echo 1 || echo 0
0
[root@localhost tools]# [[ 12 > 13 ]]&&echo 1 || echo 0
0
[root@localhost tools]# [[ 12 < 13 ]]&&echo 1 || echo 0
1
逻辑操作符
在[]中使用的逻辑操作符 在[[]]中使用的逻辑操作符 说明
-a && and
-o || or
! ! not 取反
[root@localhost tools]# [ -f "$f1" -a -f "$f2" ]&& echo 1 || echo 0
1
观察系统脚本 nfs
# Source networking configuration.
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
[root@localhost scripts]# sed -n '87,90p' /etc/init.d/nfs
[ "$NFSD_MODULE" != "noload" -a -x /sbin/modprobe ] && {
/sbin/modprobe nfsd
[ -n "$RDMA_PORT" ] && /sbin/modprobe svcrdma
}