Shell if语句的用法(非常详细,附带实例)
if 条件判断语句在 Shell 脚本中是最常见的,它主要用于判断是否符合指定的条件。
if 条件判断语句具体怎么用?这里通过现实生活中的一个案例给大家解释清楚。在坐地铁的时候我们经常会发现地铁门口摆着“儿童免票的身高标准为1.3米”的提示牌,这就是一个判断条件,将“儿童免票的身高标准为1.3米”融合到 if 判断语句中就变成:
在整个语句体中,if、then 和 fi 这三者(关键字)是永远不会变的固定格式,其中要注意的是开头使用的是 if,结尾用的是 fi。
语句体中的指定判断条件可以写成条件判断表达式,也可以写成数学逻辑运算表达式,还可以加入复杂的逻辑判断等,具体见下表:
在语句体中,statement1、statement2… 都是自定义的内容。若判断条件的结果为真,希望接下来执行什么操作,写到这里即可。
单分支表达式的执行逻辑:判断指定判断条件的结果是真还是假,若是真,则执行 if 表达式内部的自定义语句;若结果是假,不执行 if 表达式内部的语句(跳过),继续执行后面(if 条件判断语句之外)的内容,若后面没有内容,Shell 脚本执行结束。
【实例】if 条件判断语句。
相比单分支 if 语句,双分支 if 语句多了关键字 else,它表达的含义是“否则”,完整来说就是,若判断结果为真,执行某一操作;若判断结果为假,执行另一操作。
【实例】双分支 if 判断语句。
多分支表达式的执行逻辑是,对 if 后面的条件进行判断:
【实例】判断用户输入的是文件还是目录。
【实例】根据输入的考试分数来区分优秀、合格和不合格:
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 的值大于 50if 判断语句中的判断条件是多种多样的,大家可以尝试着进行改写,只有这样才算是掌握了 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 后面的条件进行判断:
- 若结果为真则执行 then 后面的自定义命令,命令执行完成后会转到 fi 位置结束;
- 若 if 后面判断条件的结果为假则跳过,对第一个 elif 后面的条件进行判断,若结果为真则执行 then 后面的自定义命令,命令执行完成后转到 fi 位置结束;
- 若第一个 elif 的条件判断的结果为假,则继续跳过,再对第二个 elif 后面的条件进行判断,依此类推……;
- 若所有条件都不成立,则执行 else 后面的命令,命令执行完成后转到 fi 位置结束。
【实例】判断用户输入的是文件还是目录。
[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 您输入的数字超过范围,请重新输入