目录
一、条件测试
1.文件测试
要使Shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常
test命令
测试表达式是否成立,若成立返回0,否则返回其他数值格式1:test 条件表达式
格式2:[ 条件表达式 ] #注意中括号和表达式中间需要隔一个空格
或
格式3:[[ 条件表达式 ]]
常用的测试操作符 | 功能 |
-d | 测试是否为目录(Directory) |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试是否设置有可执行(Excute)权限 |
-b | 测试是否为设备文件 |
-c | 测试是否为字符设备文件 |
-s | 测试存在且文件大小为空 |
-L | 测试是否为链接文件 |
2.整数测试(数值比较)
整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等于、小于第二个数
常用测试操作符 | 含义 |
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于或等于 |
-le | 小于或等于 |
3.字符串测试(字符串比较)
字符串比较通常用来检查用户输入、系统环境等是否满足条件,在提供交互式操作的Shell脚本中,也可用来判断用户输入的位置参数是否符合要求。字符串比较的常用操作选项如下:
操作选项 | 含义 |
= | 第一个字符串与第二个字符串相同 |
!= | 第一个字符串与第二个字符串不相同,其中“!”符号表示取反 |
-z | 检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串 |
格式1:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:[-z 字符串]
4.逻辑测试
逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或者只要有其中一个成立等情况,需要有一个测试的过程
常用的逻辑测试操作如下,使用时放在不同的测试语句或命令之间
&& | 逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为0 |
|| | 逻辑或,表示“或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为0 |
! | 逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为0 |
二、if语句
1.if语句的结构
单个括号([ ]):必须要有空格两个字符或数字之间的比较左右必须有空格
(1)条件判断:test一种形式,[ ]中间只能使用 = 和!= 比较字符串 ,如果使用 < 、>需要进行转义\(2)然后中间如果比较数字要用 -lt 等符号, 不能使用\<比较数字,他会当成字符串处理
两个括号([[ ]]):可用于处理逻辑命令,也可以处理字符串是否相等,且使用 < 、>不用转义符
2.单分支if语句
单分支 if 语句:对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作
语法格式:
if [ condition ]; then
# 如果 condition 为 true,则执行这里的代码块
statement
fi
3.双分支if语句
双分支 if 语句只是在单分支的基础上针对“条件不成立”的情况执行另一种操作,而不是 “坐视不管”地不执行任何操作
语法格式:
if [ condition ]; then
# 如果 condition 为 true,则执行这里的代码块
statement1
else
# 如果 condition 不为 true,则执行这里的代码块
statement2
fi
4.多分支if语句
与单分支、双分支 if 语句相比,多分支 if 语句的结构能够根据多个互斥的条件分别执行不同的操作
语法结构:
if [ condition1 ]; then
# 如果 condition1 为 true,则执行这里的代码块
statement1
elif [ condition2 ]; then
# 如果 condition1 不满足且 condition2 为 true,则执行这里的代码块
statement2
elif [ condition3 ]; then
# 如果 condition1 和 condition2 都不满足且 condition3 为 true,则执行这里的代码块
statement3
else
# 如果上述所有条件都不满足,则执行这里的代码块
default_statement
fi
5.嵌套if语句
语法结构:
if [ condition1 ]; then
# 如果 condition1 为 true,则执行这里的代码块
if [ condition2 ]; then
# 如果 condition2 也为 true,则执行这里的代码块
statement1
else
# 如果 condition2 不为 true,则执行这里的代码块
statement2
fi
else
# 如果 condition1 不为 true,则执行这里的代码块
statement3
fi
三、case分支语句
case语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写
case语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值
语法格式:
case 值 in
模式1)
# 如果值匹配模式1,则执行这里的代码块
command1
;;
模式2)
# 如果值匹配模式2,则执行这里的代码块
command2
;;
模式3|模式4)
# 如果值匹配模式3或模式4,则执行这里的代码块
command3
;;
*)
# 如果值与上述所有模式都不匹配,则执行默认代码块
default_command
;;
esac