Shell 脚本条件测试与 if 语句
Shell 脚本条件测试与 if 语句
一、条件测试类型
- 整数测试:比较两个整数的大小或相等性。
- 字符测试:比较字符串或检查字符串属性。
- 文件测试:检查文件或目录的属性、权限等。
二、条件测试的表达式
Shell 提供了三种方式进行条件测试:
- [ 条件表达式 ]
- [[ 条件表达式 ]]
- test 条件表达式
示例
test -e file && echo true || echo false
[ -e file ] && echo true || echo false
[[ -e file ]] && echo true || echo false
三、整数测试
运算符 | 说明 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
示例:比较两个整数
判断是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于
方式一:通过命令行参数传递
#!/bin/bash
if [ $# -ne 2 ]; thenecho "必须输入两个参数"exit
fiexpr $1 + $2 >/dev/null 2>&1
if [ $? -ne 0 ]; thenecho "输入的参数必须是整数"exit
fiif [ $1 -gt $2 ]; thenecho "$1 大于 $2"
elif [ $1 -eq $2 ]; thenecho "$1 等于 $2"
elseecho "$1 小于 $2"
fi
方式二:通过 read
输入
#!/bin/bash
read -p "请输入两个整数: " n mexpr $n + $m >/dev/null 2>&1
if [ $? -ne 0 ]; thenecho "输入的参数必须是整数"exit
fiif [ $n -gt $m ]; thenecho "$n 大于 $m"
elif [ $n -eq $m ]; thenecho "$n 等于 $m"
elseecho "$n 小于 $m"
fi
>/dev/null 2>&1
表示将标准输出和错误输出都重定向到/dev/null
(即丢弃所有输出)。
示例:菜单选择
#!/bin/bash
echo "请选择你喜欢的颜色:"
cat <<EOF
1.黑色
2.蓝色
3.红色
EOFread -p "请输入你喜欢颜色编号: " num
[ $num -eq 1 -o $num -eq 2 -o $num -eq 3 ]&&{[ $num -eq 1 ]&&{echo '你喜欢黑色!'exit}[ $num -eq 2 ]&&{echo '你喜欢蓝色'exit}[ $num -eq 3 ]&&{echo '你喜欢红色'exit}
}||{echo '其他'exit
}
四、字符测试
运算符 | 说明 |
---|---|
== 或 = | 字符串相等(两边需空格) |
!= | 字符串不等 |
-z "str" | 字符串为空则为真 |
-n "str" | 字符串非空则为真 |
五、文件测试
存在性测试:
-e
:文件是否存在
类型测试:
-b
:块设备文件-c
:字符设备文件-f
:普通文件-d
:目录-L
:符号链接文件-p
:命名管道文件-S
:套接字文件
权限测试:
-r
:可读-w
:可写-x
:可执行
特殊权限测试:
-g
:设置了 SGID-u
:设置了 SUID-k
:设置了 Sticky Bit
其它测试:
-s
:文件非空-N
:文件自上次读取后被修改-O
:文件属于当前用户-G
:文件属组是当前用户组
双目测试:
file1 -ef file2
:是否相同 inodefile1 -nt file2
:file1 是否比 file2 新file1 -ot file2
:file1 是否比 file2 旧
示例
[root@yanyvhang tmp]# mkdir /tmp/dir1
[root@yanyvhang tmp]# ln -s /tmp/dir1 /tmp/dir2
[root@yanyvhang tmp]# mkdir /tmp/dir3
[root@yanyvhang tmp]# chmod g+s /tmp/dir3
#!/bin/bash
a=/tmp/file1
b=/tmp/file2
c=/tmp/dir1
d=/tmp/dir2
e=/tmp/dir3
f=/tmp/file4
[ -e $a ]&&echo "file1文件已存在"||echo "file1文件不存在"
[ -e $f ]&&echo "file4文件存在"||echo "file4文件不存在"
[ -f $b ]&&echo "file2这是一个普通文件"||echo "file2不是普通文件"
[ -d $c ]&&echo "dir1这是一个目录"||echo "dir1不是一个目录"
[ -L $d ]&&echo "dir2这是一个链接文件"||echo "dir2不是一个链接文件"
[ -g $e ]&&echo "dir3这个具有SGID权限"||echo "dir3不具有SGID权限"
六、组合测试条件
-a
等价于&&
- 与关系
-o
等价于||
- 或关系
!
等价于!=
- 非关系
示例
七、if 语句
单分支 if
if [ 条件 ]; then命令
fi
示例:判断当前用户是否为 root
#!/bin/bash
if [ "$USER" != "root" ]; thenecho "ERROR: need to be root so that!"
fi
多分支 if
if [ 条件 ]; then命令1
elif[ 条件 ]; then命令3
else命令2
fi
示例:判断当前用户是否为 root
#!/bin/bash
if [ $USER = "root" ];thenecho "hey admin"
elseecho "hey guest"
fi
示例:比较两个整数
判断是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于
#!/bin/bash
read -p '请输入要比较的两个参数:' n mexpr $n + $m >/dev/null 2>&1
[ $? -ne 0 ]&&{echo '输入的参数必须是整数'exit
}if [ $n -gt $m ];thenecho "$n大于$m"elif [ $n -eq $m ];thenecho "$n等于$m"
elseecho "$n小于$m"
fi