首页 > 编程笔记 > Linux笔记 阅读:138

Shell if语句的用法(非常详细,附带实例)

if 条件判断语句在 Shell 脚本中是最常见的,它主要用于判断是否符合指定的条件。

if 条件判断语句具体怎么用?这里通过现实生活中的一个案例给大家解释清楚。在坐地铁的时候我们经常会发现地铁门口摆着“儿童免票的身高标准为1.3米”的提示牌,这就是一个判断条件,将“儿童免票的身高标准为1.3米”融合到 if 判断语句中就变成:

判断儿童的身高是否小于等于1.3米,若小于或等于1.3米则符合判断条件(真),免票放行;若大于1.3米则不符合判断条件(假),拒绝免票。

if 条件判断语句的类型有 3 种,分别是:单分支、双分支和多分支。

Shell if单分支语句

单分支 if 条件判断语句是流程控制语句中最基本的语法,格式非常简单,具体如下:
if 指定判断条件 ; then
    statement1
    statement2
    ...
fi
若关键字 if 与 then 在同一行则必须使用分号隔开,不在一行可以不用。

在整个语句体中,if、then 和 fi 这三者(关键字)是永远不会变的固定格式,其中要注意的是开头使用的是 if,结尾用的是 fi。

语句体中的指定判断条件可以写成条件判断表达式,也可以写成数学逻辑运算表达式,还可以加入复杂的逻辑判断等,具体见下表:

表:指定判断条件
表达式 格式
条件判断表达式 [ 条件表达式 ]
条件判断表达式 [[ 条件表达式 ]]
数学逻辑运算表达式 ((数学逻辑运算表达式))
逻辑判断表达式 逻辑与:&& 或 -a
逻辑判断表达式 逻辑或:|| 或 -o
逻辑判断表达式 逻辑非:!

在语句体中,statement1、statement2… 都是自定义的内容。若判断条件的结果为真,希望接下来执行什么操作,写到这里即可。

单分支表达式的执行逻辑:判断指定判断条件的结果是真还是假,若是真,则执行 if 表达式内部的自定义语句;若结果是假,不执行 if 表达式内部的语句(跳过),继续执行后面(if 条件判断语句之外)的内容,若后面没有内容,Shell 脚本执行结束。

【实例】if 条件判断语句。
[root@linux opt]# vim demo24.sh
#!/bin/bash

echo "请输入变量 a 的值:"
read a
echo "请输入变量 b 的值:"
read b

echo "变量 a 的值为$a,变量 b 的值为$b"

# 数学逻辑运算
if (( $a == $b ))
then
    echo "变量 a 的值和变量 b 的值相等"
fi

# 数学逻辑运算加逻辑与
if (( $a > $b && $b > 50 ))
then
    echo "变量 a 大于变量 b 并且 变量 b 的值大于 50"
    echo "$a > $b"
fi

# 条件判断
if [ $a -eq $b ]; then
    echo "变量 a 和变量 b 确实相等"
fi

# 条件表达式加逻辑或
if [[ $a > $b ]] || [[ $b > 50 ]]; then
    echo "变量 a 大于变量 b 或者 变量 a 的值大于 50"
fi

[root@linux opt]# bash demo24.sh
请输入变量 a 的值:
97
请输入变量 b 的值:
97
变量 a 的值为97,变量 b 的值为97
变量 a 的值和变量 b 的值相等
变量 a 和变量 b 确实相等
变量 a 大于变量 b 或者 变量 a 的值大于 50

[root@linux opt]# bash demo24.sh
请输入变量 a 的值:
87
请输入变量 b 的值:
14
变量 a 的值为87,变量 b 的值为14
变量 a 大于变量 b 或者 变量 a 的值大于 50
if 判断语句中的判断条件是多种多样的,大家可以尝试着进行改写,只有这样才算是掌握了 if 判断语句。

Shell if双分支语句

接着介绍双分支 if 语句,语法格式如下:
if 判断条件 ; then
    statement1
    statement2
    ...
else
    statement1
    statement2
    ...
fi
双分支表达式的执行逻辑:判断判断条件的结果是真是假,若结果为真,则执行 then 后面的语句;若结果为假,则执行 else 后面的语句,最后以 fi 语句收尾。

相比单分支 if 语句,双分支 if 语句多了关键字 else,它表达的含义是“否则”,完整来说就是,若判断结果为真,执行某一操作;若判断结果为假,执行另一操作。

【实例】双分支 if 判断语句。
[root@linux opt]# vim demo25.sh
#!/bin/bash

echo "请输入变量 a 的值:"
read a
echo "请输入变量 b 的值:"
read b

echo "变量 a 的值为$a ,变量 b 的值为$b "

# 数学逻辑运算
if (( $a == $b ));then
    echo "变量 a 的值和变量 b 的值相等"
else
    echo "变量 a 的值和变量 b 的值不相等"
fi

# 数学逻辑运算加逻辑与(if 判断语句嵌套 if 判断语句,多层次判断)
if (( $a > $b && $b > 50 ))
then
    echo "变量 a 大于变量 b 并且 变量 b 的值大于 50"
    echo "$a > $b "
else
    echo "变量 a 小于或等于变量 b,至于变量 b 是否小于 50 还得再次判断"
    if (( $b > 50 ));then
        echo "经过判断后,变量 b 大于 50"
    else
        echo "经过判断后,变量 b 小于或等于 50"
    fi
fi

# 条件判断
if [ $a -eq $b ];then
    echo "变量 a 和变量 b 确实相等"
else
    echo "变量 a 和变量 b 确实不相等"
fi

# 条件表达式加逻辑或
if [[ $a > $b ]] || [[ $b > 50 ]]; then
    echo "变量 a 大于变量 b 或者 变量 a 的值大于 50"
else
    echo "变量 a 小于或等于变量 b 并且 变量 a 的值小于或等于 50"
fi

# 判断文件是否存在,条件表达式加逻辑非
FilePath=/opt/123.txt
if [ ! -e $FilePath ];then
    echo "$FilePath 文件不存在,创建此文件"
    touch $FilePath
    echo "$FilePath 文件创建完成"
else
    echo "$FilePath 文件已存在"
fi

[root@linux opt]# bash demo25.sh
请输入变量 a 的值:
49
请输入变量 b 的值:
49
变量 a 的值为 49,变量 b 的值为 49
变量 a 的值和变量 b 的值相等
变量 a 小于或等于变量 b,至于变量 b 是否小于 50 还得再次判断
经过判断后,变量 b 小于或等于 50
变量 a 和变量 b 确实相等
变量 a 小于或等于变量 b 并且 变量 a 的值小于或等于 50

[root@linux opt]# bash demo25.sh
请输入变量 a 的值:
58
请输入变量 b 的值:
58
变量 a 的值为 58,变量 b 的值为 58
变量 a 的值和变量 b 的值相等
变量 a 小于或等于变量 b,至于变量 b 是否小于 50 还得再次判断
经过判断后,变量 b 大于 50
变量 a 和变量 b 确实相等
变量 a 大于变量 b 或者 变量 a 的值大于 50
/opt/123.txt 文件已存在

[root@linux opt]# bash demo25.sh
请输入变量 a 的值:
89
请输入变量 b 的值:
15
变量 a 的值为 89,变量 b 的值为 15
变量 a 的值和变量 b 的值不相等
变量 a 小于或等于变量 b,至于变量 b 是否小于 50 还得再次判断
经过判断后,变量 b 小于或等于 50
变量 a 和变量 b 确实不相等
变量 a 大于变量 b 或者 变量 a 的值大于 50
/opt/123.txt 文件已存在

Shell if多分支语句

最后介绍多分支 if 语句,多分支 if 语句的语法格式如下:
if 指定判断条件
then
    statement1
    ...
elif 指定判断条件
then
    statement1
    ...
elif 指定判断条件
then
    statement1
    ...
else
    statement1
    statement2
    ...
fi
多分支 if 语句在执行的时候跟前面两种就不一样了,单分支和双分支 if 语句只能写一种判断条件,而多分支 if 语句可以写多个判断条件,因为新增加了“elif”关键字,这个关键字的含义是,“如果上面的条件判断不成立(结果为假),就执行此判断条件”。判断的顺序是从上到下依次判断。

多分支表达式的执行逻辑是,对 if 后面的条件进行判断:
【实例】判断用户输入的是文件还是目录。
[root@linux opt]# vim demo26.sh
#!/bin/bash

read -p "请输入一个文件/文件夹:" file

if [ -z $file ]
then
    echo "错误!输入的内容为空"
elif [ ! -e $file ]
then
    echo "错误!输入的文件不存在"
elif [ -f $file ]
then
    echo "$file 是一个普通文件"
elif [ -d $file ]
then
    echo "$file 是一个目录"
    q1=`ls $file | wc -l`
    if (( $q1 > 0 )); then
        echo "目录中有文件"
    else
        echo "目录中没文件"
    fi
else
    echo "$file 是其他类型的文件"
fi

[root@linux opt]# mkdir Empty_folder Folder
[root@linux opt]# touch 123.txt
[root@linux opt]# touch Folder/456.txt
[root@linux opt]# bash demo26.sh
请输入一个文件/文件夹:123.txt
123.txt 是一个普通文件
请输入一个文件/文件夹:Empty_folder
Empty_folder 是一个目录
目录中没文件
[root@linux opt]# bash demo26.sh
请输入一个文件/文件夹:Folder
Folder 是一个目录
目录中有文件

【实例】根据输入的考试分数来区分优秀、合格和不合格:
[root@linux opt]# vim demo27.sh
#!/bin/bash

read -p "请输入您的成绩(0~100):" num
if [ $num -gt 100 ]
then
    echo "您输入的数字超过范围,请重新输入"
elif [ $num -ge 80 ]
then
    echo "您的分数为$num, 优秀"
elif [ $num -ge 60 ]
then
    echo "您的分数为$num, 及格"
else
    echo "您的分数为$num, 不及格"
fi

[root@linux opt]# bash demo27.sh
请输入您的成绩(0~100):49
您的分数为 49,不及格

[root@linux opt]# bash demo27.sh
请输入您的成绩(0~100):69
您的分数为 69,及格

[root@linux opt]# bash demo27.sh
请输入您的成绩(0~100):89
您的分数为 89,优秀

[root@linux opt]# bash demo27.sh
请输入您的成绩(0~100):110
您输入的数字超过范围,请重新输入

相关文章