shell if判断的应用方法

2023-12-27 15:22:01

简介

? ? if 是 shell 中的一种条件判断语句,它可以在满足某个条件时触发某个任务,当条件不满足时触发另一个任务的用法。

? ? ? ??

文章目录如下:

1. if 语句的作用

2. 基础语法

2.1. 判断单个条件

2.2. 判断多个条件

2.3. 判断条件以外的情况

3. 详细用法

3.1. 整数判断

if [ ] 语法

if [[ ]] 语法

3.2. 字符串判断

if [ ] 语法

if [[ ]] 语法

3.3. 为空判断

3.4. 文件判断

3.5. 逻辑判断

if [ ] 语法

if [[ ]] 语法

3.6. 多层嵌套

3.7. 单行写法


????????

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

????????

总结

  1. 使用 if [ ] 判断整数需要参数指定,如果喜欢直接用符号表示就用 if [[ ]] 语法。
  2. if [ ] 判断中的变量不能带引号,会被解释为字符串,无法判断。
  3. 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 不能退出脚本,只能退出这个括号。

文章来源:https://blog.csdn.net/m0_61066945/article/details/135201471
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。