前置知识准备
## if简单语句
`&&` 如果是"前面", 则"后面"
`||` 如果不是"前面", 则"后面"
## 测试指令
1. 使用 `test expression` 指令测试
2. 使用 `[ expression ]` 指令测试 括号两端必须要有空格
3. 使用 `[[ expression ]]` 指令测试 括号两端必须要有空格
[
和[[
的区别- 区别一
1.在[
中使用逻辑运算符,需要使用-a
(and)或者-o
(or);
2.在[[
中使用逻辑运算符,需要使用&&
或者||
- 区别二
1.[
是shell命令,在它包围的表达式是它的命令行参数,所以串比较符>
和<
需要转义,否则就变成io重定向了;
2.[[
是shell关键字,不会做命令行扩展,所以<和>不需要进行转义
3.[[
语法相对严格,如在[
中可以用引号括起操作付,[[
则不行。如if [ "-z" "ab" ]
- 区别三
[[
可以做算术扩展,[
则不行。如if [[ 11+1 -eq 100 ]]
,而if [ 11+1 -eq 100 ]
则会报错
- 区别一
举例
# 文件存在时,则执行echo
test -e filename && echo "filename is exists"
[ -e filename ] && echo "filename is exists"
# 文件不存在时,执行echo
test -e filename || echo "filename is not exists"
[ -e filename ] || echo "filename is not exists"
文件表达式
[ -d FILE ] # 如果`FILE`存在且是一个目录则为真
[ -e FILE ] # 如果`FILE`存在则为真
[ -f FILE ] # 如果`FILE`存在且是一个普通文件则为真
[ -r FILE ] # 如果`FILE`存在且是可读的则为真
[ -w FILE ] # 如果`FILE`如果`FILE`存在且是可写的则为真
[ -x FILE ] # 如果`FILE`存在且是可执行的则为真
[ -s FILE ] # 如果`FILE`存在且大小不为0则为真
[ -h FILE ] # 如果`FILE`存在且是一个符号连接则为真(如软链接)
[ -L FILE ] # 如果`FILE`存在且是一个符号连接则为真(如软链接)
# [ -a FILE ] # 如果`FILE`存在则为真
# [ -b FILE ] # 如果`FILE`存在且是一个块特殊文件则为真
# [ -c FILE ] # 如果`FILE`存在且是一个字特殊文件则为真
# [ -g FILE ] # 如果`FILE`存在且已经设置了SGID则为真
# [ -k FILE ] # 如果`FILE`存在且已经设置了粘制位则为真
# [ -p FILE ] # 如果`FILE`存在且是一个名字管道(F如果O)则为真
# [ -t FD ] # 如果文件描述符`FD`打开且指向一个终端则为真
# [ -u FILE ] # 如果`FILE`存在且设置了SUID (set user ID)则为真
# [ -O FILE ] # 如果`FILE`存在且属有效用户ID则为真
# [ -G FILE ] # 如果`FILE`存在且属有效用户组则为真
# [ -S FILE ] # 如果`FILE`存在且是一个套接字则为真
[ FILE1 -nt FILE2 ] # 如果`FILE1`比`FILE2`新,或者`FILE1`存在且`FILE2`不存在则为真
[ FILE1 -ot FILE2 ] # 如果`FILE1`比`FILE2`要老, 或者`FILE2`存在且`FILE1`不存在则为真
# [ FILE1 -ef FILE2 ] # 如果`FILE1`和`FILE2`指向相同的设备和节点号则为真
整数变量表达式
[ 1 -eq 1 ] && echo "等于"
[ 1 -ne 1 ] || echo "不等于"
[ 1 -gt 1 ] || echo "大于"
[ 1 -ge 1 ] && echo "大于等于"
[ 1 -lt 1 ] || echo "小于"
[ 1 -le 1 ] && echo "小于等于"
字符串变量表达式
[ -z STRING ] # "STRING"的长度为零则为真
[ -n STRING ] or [ STRING ] # "STRING"的长度为非零 non-zero则为真
[ STRING1 == STRING2 ] # 如果2个字符串相同 "="may be used instead of "=="for strict POSIX compliance则为真
[ STRING1 != STRING2 ] # 如果字符串不相等则为真
逻辑表达式
表达式与前面的
=
!=
-d
–f
–x
-ne
-eq
-lt
等合用
逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列注意:
逻辑与-a
与逻辑或-o
很容易和其他字符串或文件的运算符号搞混了
# 逻辑非 ! 条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $dir ] 如果不存在目录$dir
# 逻辑与 –a 条件表达式的并列
if [ 表达式1 –a 表达式2 ]
# 逻辑或 -o 条件表达式的或
if [ 表达式1 –o 表达式2 ]