Shell脚本之条件测试、if、case条件测试语句

x33g5p2x  于2021-10-20 转载在 Shell  
字(2.7k)|赞(0)|评价(0)|浏览(494)

一、条件测试

1.1test命令

测试特定的表达式是否成立,当条件成立,测试语句的返回值为0,否则为其他数值 。

格式:
test 条件表达式
或 [ 条件表达式 ]  (条件表达式的两边都需要有空格,且此方法更为常用)

1.2文件测试

1.2.1文件测试常见选项

常见的测试操作符含义
-d测试是否为目录(directory)
-e测试目录或文件是否存在(Exist)
-f测试是否为文件(File)
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试当前用户是否有权限执行(eXcute)
-L测试是否为软连接文件
-nt判断文件A是否比文件B新
-ot判断文件A是否比文件B旧
-ef判断两个文件是否为同一文件

示例1:

示例2:

**示例3:**可以使用&&和echo一起用

示例4:可以和||一起用

**示例5:**比较两个文件

1.3整数值比较

格式:
[ 整数1 操作符 整数2 ]

常见测试操作符:

操作符含义
-eq等于(Equal)
-ne不等于(Not Equal)
-lt小于(Leser Than)
-gt大于(Greater Than)
-le小于或等于(Lesser or Equal)
-ge大于或等于(Greater or Equal)

示例1: :查询当前目录下的文件数是否大于10,如果大于,则进行提示。

[root@localhost ~]#ls |wc -l
15
[root@localhost ~]#test `ls |wc -l` -gt 10 && echo 文件数大于10
文件数大于10

示例2: 查看系统内存是否低于1024M,如果低于则提示。

[root@localhost ~]#free -m
              total        used        free      shared  buff/cache   available
Mem:           1758         359         790          17         608        1161
Swap:          3839           0        3839
[root@localhost ~]#free -m|grep "Mem"
Mem:           1758         359         791          17         608        1161
[root@localhost ~]#free -m|grep "Mem"|awk '{print $4}'
790
[root@localhost ~]#free=`free -m|grep "Mem"|awk '{print $4}'`
[root@localhost ~]#echo $free 
790
[root@localhost ~]#test `echo $free` -lt 1024 && echo 内存不足1024M
内存不足1024M
[root@localhost ~]#

1.4字符串比较

格式:
[ 字符串1 = 字符串2 ] 			#判断是否相等
[ 字符串1 != 字符串2 ] 			#判断是否不等
[ -z 字符串 ]                     #判断字符串内容是否为空

操作符:

操作符含义
=字符串内容相同
!=字符串内容不同,!号表示相反的意思
-z字符串内容为空

示例: 判断当前系统语言环境是否为“us.en”,如果不是则提示

[root@localhost ~]#echo $LANG
zh_CN.UTF-8
[root@localhost ~]#test `echo $LANG`="us.en"&&echo 当前系统语言不是us.en,当前系统语言为`echo $LANG`
当前系统语言不是us.en,当前系统语言为zh_CN.UTF-8
[root@localhost ~]#

1.5逻辑测试

格式:
[ 表达式1 ] 操作符 [ 表达式2 ]
命令1 操作符 命令2

操作符:

-a或&&逻辑与,而且的意思
-o或▕▕逻辑或,或者的意思
逻辑否

二、if语句

2.1单分支结构

格式:
if [ 条件判断式 ]; than
	当条件判断成立时,执行一条或多条命令
fi

如果只有一个判断式要进行,那么我们可以使用单分支的if语句 ,只有在条件成立时才会执行,否则不执行任何操作

示例: 使用单分支if语句判断test文件是否存在

[root@localhost ~]#if test -e data; then echo 文件存在; fi
文件存在
[root@localhost ~]#

2.2双分支结构

if [ 条件判断式 ]; then
	当条件判断成立时,可以执行一条或多条命令
else	
	当条件判断不成立时,可以执行一条或多条命令
fi

在同一个数据的判断中,如果该数据需要进行两种不同的判断,我们就需要双分支if语句了:

示例: 判断用户输入的是否为yes

[root@localhost ~]#vim reboot.sh 

#/bin/bash
read -p "请输入yes确定重启:" TEST
if [ $TEST = "yes" ]
   then
       echo 系统即将重启
else
   echo 没有输入yes,系统将不重启
fi

2.3多分支结构

if [ 条件判断式 ]; then
	当条件判断成立时,可以执行一条或多条命令
elif [ 条件判断式二 ]; then
	当条件判断成立时,可以执行一条或多条命令
else	
	当上面的条件判断都不成立时,可以执行一条或多条命令
fi

如果数据需要进行多种不同的判断,则可以使用多分支结构 嵌套使用。

[root@localhost ~]#vim reboot1.sh 

read -p "请输入yes或no:" TEST
if [ $TEST = "yes" ]
   then
     echo 你输入的为$TEST!
   elif [ $TEST = "no" ]
      then
         echo 你输入的为$TEST!
else
   echo 你输入的${TEST}有错误,请重启输入yes或者no!  
fi

三、case语句

格式:
case 变量名称 in
模式1)
	命令序列
    ;;
模式2)
	程序段
	;;
*)
	不包含第一个变量内容与第二个变量内容的其他程序执行段
	默认程序段
	;;
esac

注意点:

case行首必须以单词“in”,每一模式必须以单个右括号")"结束
*
双分号";;"表示命令序列的结束
*
模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以使用竖杠|表示或,比如a|b
*
最后的*)表示默认模式,其中的*相当于通配符

**示例:**不管输出大小写字母,都能输出yes或者no

#!/bin/bash
read -p "请输入yes或者no:" i
case $i in  
[Yy]|[Yy][Ee][Ss])
echo "你输入的yes正确"
;;
[Nn]|[Nn][Oo])
echo "你输入的no正确"
;;
esac

相关文章