shell编程条件语句与case语句

shell编程条件语句与循环结构

  • 一 条件测试
    • 1.1 文件测试
    • 1.2 整数值比较
    • 1.3 字符串比较
  • 二 if语句
    • 2.1 if语句单分支结构
    • 2.2 if语句双分支结构
    • 2.3 if语句多分支结构
    • 2.4 $0的妙用
  • 三 case语句

一 条件测试

1.1 文件测试

根据给定的路径名称,判断对应的是文件还是目录。或者判断文件是否可读、可写、可执行。
常见的文件操作选项如下:

操作选项 解释
-d (directory)测试是否为目录
-e (exist)测试目录或文件是否存在
-f (file)测试是否为文件
-r (read)测试当前用户是否有权限读取
-w (write)测试当前用户是否有权限写入
-x (excute)测试是否设置有可执行权限

执行条件测试操作后,通过预定义变量“$?”可以获得测试命令的返回状态值,如果返回值为0,表示条件成立;如果返回值不为0(通常为1)表示条件不成立。
shell编程条件语句与case语句_第1张图片
直接输出
在这里插入图片描述
两个文件之间的比较

操作选项 解释
-nt 判断文件A是否比文件B新
-ot 判断文件A是否比文件B旧
-ef 判断两个文件是否为同一个文件,用来判断两个文件是否指向同一个inode

在这里插入图片描述

1.2 整数值比较

操作选项 解释
-eq 第一个整数等于(equal)第二个整数
-ne 第一个数不等于(not equal)第二个数
-gt 第一个数大于(greater than)第二个数
-lt 第一个数小于(lesser than)第二个数
-le 第一个数小于等于(lesser or equal)第二个数
-ge 第一个数大于或等于(greater or equal)第二个数

例:
判断当前登录用户数,超过5个时输出“too many”
在这里插入图片描述
拓展
if语句也可以写成该形式
在这里插入图片描述

1.3 字符串比较

操作选项 解释
= 第一个字符串与第二个字符串相同
!= 第一个字符串与第二个字符串不同
-z 检查字符串是否为空(zero)

[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
在这里插入图片描述
注意
当等号两边有空格的时候左右两边都需要加入双引号,如果左边变量未加双引号,则等号左右两边不需要空格。

二 if语句

2.1 if语句单分支结构

对于单分支选择结构,只有在条件成立时才会执行相应代码,否则不会执行任何操作。当只需要判定一种情况时可以选用单分支结构。
shell编程条件语句与case语句_第2张图片

if 条件测试操作 
then
	命令序列
fi

例:

a=2
b=1
if [ $a -gt $b ]
then
	echo "$a$b大"
fi

也可以写成条件测试的形式

[root@localhost ~]# [ $a -gt $b ] && echo "${a}bi${b}da"

在这里插入图片描述

2.2 if语句双分支结构

双分支选择结构针对“条件成立”和“条件不成立”两种情况分别执行不同的操作。当判定结果需要分两种情况讨论时一般采用双分支结构。
shell编程条件语句与case语句_第3张图片

if 条件测试操作 
then
	命令序列1
else
	命令序列2
fi

例:

#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null	//表示ping3次,每次间隔0.2秒,等待超时3秒;$1表示第一个位置参数
if [ $? -eq 0 ]		//判断前一条命令的返回状态
then
	echo "Host $1 is up."
else
	echo "Host $1 is down."
fi

写成条件测试形式

[root@localhost ~]# [ $? -eq 0 ] && echo "up" || echo "down"

在这里插入图片描述

2.3 if语句多分支结构

多分支选择结构分别针对多种情况执行不同操作。当判定结果需要分三种或三种以上情况讨论时可以采用多分支结构。
shell编程条件语句与case语句_第4张图片

if 条件测试操作1 
then
	命令序列1
elif 条件测试操作2
then
	命令序列2
else
	命令序列3
fi

例:

#!/bin/bash
read -p "请输入你想考的分数:" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
        echo "$GRADE 分,优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
        echo "$GRADE 分,合格"
else
        echo "$GRADE 分,不及格"
fi

写成条件判断语句

[root@localhost ~]# [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] && echo "$GRADE 分,优秀" || [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] && echo "$GRADE 分,合格" || echo "$GRADE 分,不及格"

在这里插入图片描述

2.4 $0的妙用

上面程序的健壮性仍然有待提高,因为当输入其他不正常的分数时默认都会显示“不合格”,此时可以使用$0返回当前程序,强制用户输入一个正常的分数,比如0-100之间的。

if语句判断成绩
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
cj(){
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
        echo "$GRADE 分,优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
        echo "$GRADE 分,合格"
else
        echo "$GRADE 分,不及格"
fi
}

if [ $GRADE -gt 100 ] | [ $GRADE -lt 0 ]
then
        echo "please input right number"
        $0
else
        cj
fi

三 case语句

多分支if语句可以改用case语句进行改写,这样操作可以使得结构更加清晰、层次分明
shell编程条件语句与case语句_第5张图片

case 变量值 in
模式1)
	命令序列1
	;;
模式2)
	命令序列2
	;;
	......
	
*)
	默认命令序列
esac

例1:
成绩判断等第,由于case语句无法匹配范围([0-9],[a-z],[A-Z]除外),所以此处可以写个函数judge()把一个范围里的数都归为一类,返回相同值,再用case语句对该值进行分类判断。
方法1:

#!/bin/bash
read -p "请输入你想考的分数:" GRADE
judge(){
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
        echo "a"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
        echo "b"
fi						//else可省略
}

case `judge` in			//调用函数judge()
a)
        echo "$GRADE 分,优秀"
        ;;
b)
        echo "$GRADE 分,合格"
        ;;
*)
        echo "$GRADE 分,不及格"
esac

方法2

#!/bin/bash
read -p "请输入你的成绩:" GRADE
case "$GRADE" in
#[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])
[1-5][0-9]|[0-9])
        echo "你的成绩不合格"
        ;;
6[0-9]|7[0-4])
        echo "你的成绩合格"
        ;;
7[5-9]|8[0-4])
        echo "你的成绩良好"
        ;;
8[5-9]|9[0-9]|100)
        echo "你的成绩优秀"
        ;;
*)
        echo "输入有误"
esac

例2:
用shell脚本实现http开关操作
shell编程条件语句与case语句_第6张图片
awk表示提取字段,会在后面的博客中进行详解

你可能感兴趣的:(shell)