文章目录
一、条件判断语法结构
1. 条件判断语法格式
测试表达式是否成立,若成立返回0,否则返回其他数值
格式一:test 条件表达示
格式二:[ 条件表达示 ]
格式三: [[ 条件表达式 ]] 支持正则
特别说明:
[ 两边有空格 ] [[ 两边有空格]]
注:if 中使用 =~操作符 是指支持shell正则表达。
2. 条件判断相关参数
判断文件类型,判断文件新旧,判断字符串是否相等,判断权限等等…
(1)判断文件类型
判断参数 | 含义 |
---|---|
-e | 判断文件是否存在(任何类型文件) |
-f | 存在且是普通文件 |
-d | 存在且是目录 |
-L | 软连接文件 |
-b | 块设备文件 |
-S | 套接字文件 |
-c | 字符设备文件 |
-p | 命名管道文件 |
-s | 非空文件(有内容) |
举例说明:
test -e file 只要文件存在条件为真
[ -d /shell01/dir1 ] 判断目录是否存在,存在条件为真
[ ! -d /shell01/dir1 ] 判断目录是否存在,不存在条件为真
[[ -f /shell01/1.sh ]] 判断文件是否存在,并且是一个普通的文件
2.判断文件权限
判断参数 | 含义 |
---|---|
-r | 当前用户对其是否可读 |
-w | 当前用户对其是否可写 |
-x | 当前用户对其是否可执行 |
-u | 是否有suid,高级权限冒险位 |
-g | 是否sgid,高级权限强制位 |
-k | 是否有t位,高级权限粘滞位 |
3.判断文件新旧
说明:这里的新旧指的是文件的修改时间。
判断参数 | 含义 |
---|---|
file1 -nt file2 | 比较file1是否比file2新 |
file1 -ot file2 | 比较file1是否比file2旧 |
file1 -ef file2 | 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode |
4.判断整数
判断参数 | 含义 |
---|---|
-eq | 相等 |
-ne | 不等 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
5.判断字符串
判断参数 | 含义 |
---|---|
-z | 判断是否为空字符串,字符串长度为0则成立 |
-n | 判断是否为非空字符串,字符串长度不为0则成立 |
string1 == string2(等号两边有空格) | 判断字符串是否相等 |
string1 != string2(等号两边有空格) | 判断字符串是否相不等 |
6.多重条件判断
判断符号 含义 举例
-a 和 && 逻辑与 [ 1 -eq 1 -a 1 -ne 0 ] [ 1 -eq 1 ] && [ 1 -ne 0 ]
-o 和 || 逻辑或 [ 1 -eq 1 -o 1 -ne 1 ] [ 1 -eq 1 ] || [ 1 -ne 0 ]
特别说明:
-
&& 前面的表达式为真,才会执行后面的代码
-
|| 前面的表达式为假,才会执行后面的代码
-
; 只用于分割命令或表达式
二、流程控制语句
1.if语句
(1)IF结构
F:表示false,为假
T:表示true,为真
if [ condition ];then
command
command
fi
if test 条件;then
命令
fi
if [[ 条件 ]];then
命令
fi
[ 条件 ] && command
(2)if…else结构
if [ condition ];then
command1
else
command2
fi
[ 条件 ] && command1 || command2
例子(ping主机)
[root@root dev]# vi ping.sh ##编写脚本文件
#!/bin/bash
ping -c 3 -i 0.2 -w 3 $1 &> /dev/null ## -c:发送3个包,-i:间隔0.2秒,-w:超时3秒
if [ $? -eq 0 ]
then
echo "$1 is up"
else
echo "$1 is down"
fi
(3)if…elif…else结构
if [ condition1 ];then
command1 结束
elif [ condition2 ];then
command2 结束
else
command3
fi
注释:
如果条件1满足,执行命令1后结束;如果条件1不满足,再看条件2,如果条件2满足执行命令2后结束;如果条件1和条件2都不满足执行命令3结束.
例子(查分数)
[root@root dev]# vi grade.sh
#!/bin/bash
read -p "请输入你的分数:" grade
if [ $grade -ge 85 ] && [ $grade -le 100 ]
then
echo "$grade分!优秀"
elif [ $grade -ge 60 ] && [ $grade -le 84 ]
then
echo "$grade分!良好"
else
echo "$grade分!不及格"
fi
(4)层层嵌套结构
if [ condition1 ];then
command1
if [ condition2 ];then
command2
fi
else
if [ condition3 ];then
command3
elif [ condition4 ];then
command4
else
command5
fi
fi
注释:
- 如果条件1满足,执行命令1;如果条件2也满足执行命令2,如果不满足就只执行命令1结束;
- 如果条件1不满足,不看条件2;直接看条件3,如果条件3满足执行命令3;如果不满足则看条件4,如果条件4满足执行命令4;否则执行命令5
例子
vim string.sh
#!/usr/bin/bash
while : #:默认值为真
do
read -p "请输入你的密码: " a
pass=123456
if [ -z $a ];then
echo "您输入的密码不能为空"
exit 1
else
if [ $a = $pass ];then
echo "登录成功"
break
else
echo "您的密码输入有误,请重新输入"
fi
fi
done
(5)多个条件联合
&&:逻辑与,前面执行成功,后面才执行。前面命令执行失败,后面命令也不执行
if [ $condition1 ] && [ $condition2 ];then
if [[ $condition1 && $condition2 ]];then
||:逻辑或,前面执行失败,后面执行,前面命令执行成功,后面不执行。
if [ $condition1 ] || [ $condition2 ];then
if [[ $condition1 || $condition2 ]];then
2.Case语句
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
......
*)
默认命令序列
;;
esac