shell if判断的应用方法
简介
? ? if 是 shell 中的一种条件判断语句,它可以在满足某个条件时触发某个任务,当条件不满足时触发另一个任务的用法。
? ? ? ??
文章目录如下:
????????
1. if 语句的作用
经常使用 Linux 的伙伴都知道,在使用某个命令时,经常需要使用某个选项来指定某个方法。例如:查看文件前5行使用 head -n 5,而 -n 这个选项是可以通过 if 判断实现的。举个类似例子
# 将第1个位置参数作为选项
option="$1"
# 判断这个选项是否为 -n
if [ "${option}" == "-n" ];then
echo "查看文件第n行"
else
echo "请输入正确的参数:$0 -n"
fi
通过 if 去判断参数是否为 -n,如果是 -n 那么执行 xxx;如果不是,输出提示信息并退出。
????????
2. 基础语法
- 基础语法只介绍语法怎么写,有基础的小伙伴直接跳到目录3
2.1. 判断单个条件
我们判断一个条件时,需要这么写
if 条件表达式
then
命令
fi
- if、then、fi 是固定的语法,不可更改。
- 条件表达式是去判断某条命令的写法
- 命令是自定义的命令,判断为真,执行;判断为假,不执行。
????????
这里的 "条件表示式" 表示我们需要指定一个条件,如果条件为真,那么执行 if 中的命令。例如
if true
then
echo "条件为真,执行这里的命令"
fi
这里的条件直接给了一个 true:表示真,所以执行 if 中间的代码。
如果给定一个 false:表示假,则不会执行 if 中间的代码
if false
then
echo "条件为真,执行这里的命令"
fi
条件为 false 不会去执行中间的代码。
????????
什么是真,什么是假呢?
就是这个条件判断的结果是真的还是假的,比如判断 a 是不是 a(肯定是真的嘛)
if [ "a" == "a" ]
then
echo "条件为真,执行这条命令"
fi
a = a ,这个条件成立,所以执行中间代码
那么判断 a = b 呢(肯定是假的嘛)
if [ "a" == "b" ]
then
echo "条件为真,执行这条命令"
fi
这个条件是假的,所以不执行 if 中间的代码。
????????
除了上面的写法,我们还可以把 then 与 if 放在一行,不过要在 if 后面加分号分割
if [ "a" == "a" ]; then # 这里需要加分号
echo "条件为真,执行这条命令"
fi
????????
2.2. 判断多个条件
上面学习了基本语法,我们来看看:当需要判断多个条件时,应该怎么写
if 条件表达式1; then
命令
elif 条件表达式2; then
命令
elif 条件表达式3; then
命令
fi
if、then、fi 还是固定语句,这里新增了一个语法 elif( elif 不是必选项)。elif 放在 if 和 fi 的中间,用于在一个 if 语句块中增加1种或多种判断。
举个例子:根据脚本位置参数来确定模式
option="$1"
# 如果选项为A,执行这段代码
if [ "${option}" == "A" ]; then
echo "执行模式A..."
# 如果选项为B,执行这段代码
elif [ "${option}" == "B" ]; then
echo "执行模式B..."
# 如果选项为C,执行这段代码
elif [ "${option}" == "C" ]; then
echo "执行模式C..."
fi
在这段代码中,条件判断共3组,if 为 第1组,elif 分别为第2第3组,判断的顺序从上往下。
- 先判断第1组,为真,执行第1组代码块后退出判断;为假,判断第2组。
- 判断第2组,为真,执行第2组代码块后退出判断;为假,判断第3组。
- 判断第3组,为真,执行第3组代码块后退出判断;为假,判断第4组。依次类推
????????
增加 elif 判断后能够解决大部分事情,但有时候可能需要一次性判断多种情况,语法如下:
if [ 条件判断1 [参数] 条件判断2 ]; then
命令
fi
在一条命令中判断多个需要参数来指定,比如:
判断 a=1 或者 b=2,使用 -o 参数;
判断?a=1 并且 b=2,使用 -a 参数。
【案例】需要判断变量 var1 = 'AAA'?,且 var2?= 'BBB'?才执行某些代码块(使用 -a )
var1='AAA'
var2='BBB'
if [ "${var1}" == "AAA" -a "${var2}" == "BBB" ];then
echo -e "var1为AAA,var2为BBB"
fi
????????
2.3. 判断条件以外的情况
上面讲了怎么去判断一个条件,怎么去判断多个条件,那么还有一种情况,就是条件以外的。比如判断变量 var = 'AAA' 执行某段代码,如果 var 不等于 'AAA' 呢,我们使用另一种语法 else 来表达
var="$1"
# 如果变量var为AAA,那么执行这里的代码
if [ "${var}" == "AAA" ];then
echo "执行var等于AAA的代码"
# 如果变量var不是AAA,那么执行这里的代码
else
echo "执行var不等于AAA的代码"
fi
????????
这个语法也可以与 elif 组合使用,比如
var="$1"
if [ "${var}" == "0" ];then
echo "第1个位置参数为0"
elif [ "${var}" == "1" ];then
echo "第1个位置参数为1"
elif [ "${var}" == "2" ];then
echo "第1个位置参数为2"
else
echo "第1个位置参数非0、1、2"
fi
????????
3. 详细用法
这里整理了一些常用的方法,比如判断整数、判断字符串、判断变量是否为空、判断文件是否存在、逻辑判断的方法等。这些方法我们可以使用两种语法来实现:
- if [ 条件表达式 ]
- if [[ 条件表达式 ]]
两种表达式都可以实现,但语法上有些区别。
3.1. 整数判断
if [ ] 语法
对整数的判断包括:大于、小于、等于、不等于、大于等于、小于等于 6 种方式,这 6 种需要使用参数来指定
-gt:大于
-eq:等于
-lt:小于
-ne:不等于
-ge:大于等于
-le:小于等于
【案例一】判断变量 n 大于 10
n=15
if [ ${n} -gt 10 ];then
echo -e "变量 n=${n} 大于10,执行这里的代码..."
fi
????????
【案例二】判断状态码等于0
ls
if [ $? -eq 0 ];then
echo -e "状态码为$?,上一条命令执行成功..."
fi
????????
if [[ ]] 语法
if [[ ]] 与 if [ ] 的实现结果是一样的,但语法有些区别。这里的整数判断使用符号表示:
> :大于
< :小于
= :等于
!=:不等于
>=:大于等于
<=:小于等于
【案例一】判断变量 n 不等于 1
n=3
if [[ ${n} != 1 ]];then
echo -e "变量 n=${n} 不为1,执行这里的代码..."
fi
????????
总结
- 使用 if [ ] 判断整数需要参数指定,如果喜欢直接用符号表示就用 if [[ ]] 语法。
- if [ ] 判断中的变量不能带引号,会被解释为字符串,无法判断。
- if [[ ]] 判断中的变量可以使用引号,不会引发错误。
????????
3.2. 字符串判断
if [ ] 语法
字符串比较只有 2 种
==:等于
!=:不等于
【案例一】比较变量 a 等于变量 b
a="AAA"
b="AAA"
if [ ${a} == ${b} ];then
echo "变量a与变量b相同"
fi
????????
【错误案例】变量中含有多个字符,不使用引号会引发错误
a="AAA BBB"
b="AAA BBB"
if [ ${a} == ${b} ];then
echo "变量a与变量b相同"
fi
需要在 if 中加上引号
if [ "${a}" == "${b}" ]
????????
if [[ ]] 语法
if [[ ]] 包含3种语法
==:等于
!=:不等于
=~:包含
【案例一】比较2个变量相同(这种语法可以不用加引号)
a="AAA BBB"
b="AAA BBB"
if [[ ${a} == ${b} ]];then
echo "变量a与变量b相同"
fi
????????
【案例二】判断 "前面变量" 包含 "后面变量"
a="AAA BBB CCC"
b="AAA BBB"
if [[ ${a} =~ ${b} ]];then
echo "变量a包含变量b的值"
fi
注意:必须是前面的值包含后面的,否则不成立
a="AAA BBB"
b="AAA BBB CCC"
if [[ ${a} =~ ${b} ]];then
echo "变量a包含变量b的值"
fi
b的某些字符不在a内,所以不成立
????????
【案例三】模糊匹配
a="AAA BBB CCC"
b="AAA BBB"
if [[ ${a} == ${b}* ]];then
echo "变量a包含变量b的值"
fi
使用 * 通配符匹配。如果 * 在前面不符合要求
a="AAA BBB CCC" b="AAA BBB" if [[ ${a} == *${b} ]]
????????
总结
如果字符串含有空格等多个字符,if [ ] 必须对变量加引号,否则报错;而 if [[ ]] 不需要加引号
????????
3.3. 为空判断
包含 2 种语法,这里的 if [ ] 和 if [[ ]] 通用(方法一样)
-z:判断变量为空
-n:判断变量不为空
【案例一】判断变量为空( -z?)
var=""
if [ -z "${var}" ];then
echo "变量var为空"
else
echo "变量var不为空"
fi
注意:变量包含一个空格都不为空
var=" "
????????
【案例二】判断变量不为空( -n?)
var=" "
if [ -n "${var}" ];then
echo "变量var不为空"
else
echo "变量var为空"
fi
????????
【案例三】判断变量为空( ! )
var=""
if [ ! "${var}" ];then
echo "变量var为空"
else
echo "变量var不为空"
fi
????????
【案例四】判断变量为空,不包括空格(使用 wc -w 忽略空格)
var=" "
if [ $(echo ${var} |wc -w) -eq 0 ];then
echo "变量var为空"
else
echo "变量var不为空"
fi
????????
总结
if [ ] 和 if [[ ]] 的语法都一样,-n、-z 通用。如果使用参数判断,空格也算一个字符。如果希望空格不算字符,可以使用《案例四》的方法。
????????
3.4. 文件判断
对文件或目录判断的方法较多
-f:判断文件存在
-d:判断目录存在
-e:判断文件或目录存在
-r:判断文件为可读
-w:判断文件为可写
-x:判断文件为可执行
-s:判断文件存在,且不为空
-O:判断文件存在,且被当前用户拥有
-G:判断文件存在,且默认组为当前用户组
-nt:判断"前文件"比"后文件"新
-ot:判断"前文件"比"后文件"旧
【案例一】判断文件存在( -f )
file='./file.txt'
if [ -f ${file} ];then
echo "这个文件存在"
fi
判断这个文件不存在,我们在前面加上一个感叹号即可
file='./file.txt'
if [ ! -f ${file} ];then
echo "这个文件不存在"
fi
????????
【案例二】判断 file1.txt 比 file2.txt 旧( -ot )
if [ ./file1.txt -ot ./file2.txt ];then
echo "file1比file2旧"
fi
?????????
3.5. 逻辑判断
逻辑判断实际上就3种:与、或、非。在 if [ ] 和 if [[ ]] 中存在不同的写法
if [ ] 语法
-a:表示并且(and)
-o:表示或者(or)
! :表示取反
【案例一】判断 a=10?并且 b=20 并且 c=30(3种判断必须都成立)
# 定义几个变量
a=10
b=20
c=30
# 判断可以理解为:a=10 -a b=20 -a c=30
if [ ${a} -eq 10 -a ${b} -eq 20 -a ${c} -eq 30 ];then
echo "a为10,b为20,c为30"
fi
如果其中一个条件不成立,则不执行 if? 中的代码块
a=11
????????
【案例二】判断 a=10 或者?b=20 或者?c=30(任意一个条件成立都可执行代码块)
# 定义几个变量
a=10
b=9
c=8
# 判断可以理解为:a=10 -a b=20 -a c=30
if [ ${a} -eq 10 -o ${b} -eq 20 -o ${c} -eq 30 ];then
echo "a为10,或者b为20,或者c为30"
fi
????????
if [[ ]] 语法
与 if [ ] 的语法差不多,只不过前者使用参数,if [[ ]] 使用符号:
&&:表示并且(and)
||:表示或者(or)
! :表示取反
?【案例一】判断 a=10?并且 b=20 并且 c=30(3种判断必须都成立)
# 定义几个变量
a=10
b=20
c=30
# 判断可以理解为:a=10 && b=20 && c=30
if [[ ${a} == 10 && ${b} == 20 && ${c} == 30 ]];then
echo "a为10,b为20,c为30"
fi
还可以这样写
# 定义几个变量
a=10
b=20
c=30
if [[ ${a} == 10 ]] && [[ ${b} == 20 ]] && [[ ${c} == 30 ]];then
echo "a为10,b为20,c为30"
fi
?
????????
?【案例二】判断 a=10 或者?b=20 或者?c=30(任意一个条件成立都可执行代码块)
# 定义几个变量
a=10
b=9
c=8
# 判断可以理解为:a=10 || b=20 || c=30
if [[ ${a} == 10 || ${b} == 20 || ${c} == 30 ]];then
echo "a为10,或者b为20,或者c为30"
fi
?也可以这样写
if [[ ${a} == 10 ]] || [[ ${b} == 20 ]] || [[ ${c} == 30 ]]
?????????
3.6. 多层嵌套
多层嵌套里面一般包含多个 elif 或 if,注意缩进就行。语法参考《目录 2.2》,直接看案例
【案例】编写一个创建文件或目录的脚本
mode="$1"
path="$2"
# 如果模式为f,则创建文件
if [ "${mode}" == "f" ];then
# 如果没有这个文件则创建这个文件
if [ ! -e ${path} ];then
touch ${path}
else
echo "[ERROR] ${path}文件或目录已存在"
fi
# 如果模式为d,则创建目录
elif [ "${mode}" == "d" ];then
# 如果没有这个目录则创建这个目录
if [ ! -e ${path} ];then
mkdir ${path}
else
echo "[ERROR] ${path}文件或目录已存在"
fi
# 如果模式不是f或d,则输出参数错误的信息
else
echo "[ERROR] 参数必须为 f 或 d"
exit 1
fi
????????
3.7. 单行写法
单行写法就是将 if then fi 等语法去掉,然后使用 && 表示为真,|| 表示假。
[条件表达式] && 为真代码1 && 为真代码2 || 为假代码
【案例一】执行为真的代码 &&
[ "a" == "a" ] && echo "为真执行这段代码" || echo "为假执行这段代码"
????????
【案例二】执行为假的代码 ||
[ "a" == "b" ] && echo "为真执行这段代码" || echo "为假执行这段代码"
????????
【案例三】为真执行多个代码(使用多个 &&)
[ "a" == "a" ] && echo "AAA" && echo "BBB" && echo "CCC" || echo "为假执行这段代码"
????????
【案例四】为真执行多个代码(使用括号+分号)
[ "a" == "a" ] && (echo "AAA"; echo "BBB"; echo "CCC") || echo "为假执行这段代码"
????????
【案例五】为假执行多个代码(使用括号,不能使用多个 || )
[ "a" == "b" ] && echo "为真执行这段代码" || (echo "假1"; echo "假2"; echo "假3")
|| 对应标准写法中的是 else,因为只有一个 else,所以 || 也只有写一个有效。
注意:在 || 中利用括号写多条命令时,括号中的 exit 不能退出脚本,只能退出这个括号。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!