Shell脚本判断和if语句及相关案例
条件测试类型
Shell 脚本支持三种主要的条件测试类型:
- 整数测试:数值比较
- 字符测试:字符串比较
- 文件测试:文件属性和权限检查
条件测试表达式
Shell 提供三种条件测试表达式:
# 方括号表达式
[ 条件表达式 ]# 双括号表达式(支持更多功能)
[[ 条件表达式 ]]# test 命令
test 条件表达式
整数测试运算符
运算符 | 描述 | 示例 |
---|
-eq | 等于 | [ $a -eq $b ] |
-ne | 不等于 | [ $a -ne $b ] |
-gt | 大于 | [ $a -gt $b ] |
-lt | 小于 | [ $a -lt $b ] |
-ge | 大于等于 | [ $a -ge $b ] |
-le | 小于等于 | [ $a -le $b ] |
特殊变量:
$#
:脚本参数个数$?
:上一条命令的退出状态>/dev/null 2>&1
:将标准输出和错误输出都重定向到空设备
#!/bin/bash
a=10
b=20[ $a -eq $b ]
echo $?[ $a -ne $b ]
echo $?[ $a -gt $b ]
echo $?[ $a -lt $b ]
echo $?[ $a -ge $b ]
echo $?[ $a -le $b ]
echo $? ##如果结果为0,则代表运行成功,如果为1-255,则代表运行失败
[root@xieyuhui ~]# bash b.sh
1
0
1
0
1
0
字符测试运算符
运算符 | 描述 | 示例 |
---|
== | 字符串相等 | [ "$a" == "$b" ] |
!= | 字符串不等 | [ "$a" != "$b" ] |
-z | 字符串为空 | [ -z "$a" ] |
-n | 字符串非空 | [ -n "$a" ] |
#!/bin/basha=10
b=5[ $a == $b ]
echo $?[ $a != $b ]
echo $?[ -z "$a" ] #空则为真,不空则为假
echo $?[ -n "$b" ] #不空则为真,空则为假
echo $?
[root@xieyuhui ~]# bash c.sh
1
0
1
0
文件存在性及类型测试
选项 | 描述 | 示例 |
---|
-e | 文件存在 | [ -e file ] |
-f | 是普通文件 | [ -f file ] |
-d | 是目录 | [ -d dir ] |
-L | 是符号链接 | [ -L file ] |
-b | 是块设备文件 | [ -b file ] |
-c | 是字符设备文件 | [ -c file ] |
#!/bin/bashtouch /tmp/file1
touch /tmp/file2
mkdir /tmp/dir1
ln -s /tmp/dir1 /tmp/dir2
mkdir /tmp/dir3
chmod g+s /tmp/dir3
#!/bin/basha=/tmp/file1
b=/tmp/file2
c=/tmp/dir1
d=/tmp/dir2
e=/tmp/dir3
f=/tmp/file4[ -e $a ]&&echo "file1已存在"||"file1不存在"
[ -e $f ]&&echo "file4已存在"||"file4不存在"
[ -f $b ]&&echo "file2是普通文件"||echo "file2不是普通文件"
[ -d $c ]&&echo "dir1是目录"||echo "dir1不是目录"
[ -L $d ]&&echo "dir2是链接文件"||echo "dir2不是链接文件"
[ -g $e ]&&echo "dir3有g+s权限"||echo "dir3没有g+s权限"
[root@xieyuhui ~]# bash e.sh
file1已存在
e.sh: line 11: file4不存在: command not found
file2是普通文件
dir1是目录
dir2是链接文件
dir3有g+s权限
文件比较测试
选项 | 描述 | 示例 |
---|
file1 -nt file2 | file1 比 file2 新 | [ file1 -nt file2 ] |
file1 -ot file2 | file1 比 file2 旧 | [ file1 -ot file2 ] |
file1 -ef file2 | 是同一个文件 | [ file1 -ef file2 ] |
文件权限测试
选项 | 描述 | 示例 |
---|
-r | 可读 | [ -r file ] |
-w | 可写 | [ -w file ] |
-x | 可执行 | [ -x file ] |
文件特殊属性测试
选项 | 描述 | 示例 |
---|
-s | 文件非空 | [ -s file ] |
-N | 文件被修改过 | [ -N file ] |
-O | 文件属主是当前用户 | [ -O file ] |
组合测试条件
运算符 | 描述 | 示例 |
---|
-a 或 && | 逻辑与 | [ 条件1 -a 条件2 ] 或 [ 条件1 ] && [ 条件2 ] |
-o 或 ` | | ` |
! | 逻辑非 | [ ! 条件 ] |
单分支 if 语句
if 条件; then执行的命令
fi
当前用户是不是xieyuhui,如果不是那么返回ERROR
#!/bin/bashif [ $USER != "xieyuhui" ];thenecho "ERROR"
fi
[root@xieyuhui ~]# bash a.sh
ERROR
双分支 if 语句
if 条件; then执行的命令1
else执行的命令2
fi
判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如
果是普通用户输出”hey guest“
#!/bin/bashif [ $USER="root" ];thenecho "hey admin"
elseecho "hey guest"
fi
[root@xieyuhui ~]# bash b.sh
hey admin
[root@xieyuhui ~]#
多分支 if 语句
if 条件1; then执行命令1
elif 条件2; then执行命令2
elif 条件3; then执行命令3
else执行命令4
fi
用if做判断,是否是两个参数,如果不是两个参数,则显示“必须输入两个参数”,如果输入的是两个参数,则继续运行脚本
判断是否为整数,如果输入的不是整数,则显示“输入的参数必须是整数”,如果输入的整数,则继续执行脚本
比较大小,分为三个阶段:大于、等于、小于
#!/bin/bashread -p '请输入两个参数:' n m
expr $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
[root@xieyuhui ~]# bash c.sh
请输入两个参数: 12 12
12等于12
[root@xieyuhui ~]# bash c.sh
请输入两个参数: 12 44
12小于44
[root@xieyuhui ~]# bash c.sh
请输入两个参数: 14 1
14大于1