shell条件测试和if语句语法

shell条件测试和if语句语法

一、条件测试

1、test命令

测试表达式是否成立,若不成立返回0,否则返回其他数值,通过使用echo $?查看返回值来判断对错。

格式1: test 条件表达式
格式2: [条件表达式] //表达式需要与括号分隔

这两个格式作用是完全一样的,但是格式2更常用,条件测试的条件类型有很多,所以条件表达式根据不同类型也不同格式。常用的条件操作包括有文件测试、整数值比较、字符串比较、以及多条件的逻辑测试。

2、文件测试

文件测试指的是根据给定的路径名称,判断对应的是文件还是目录,或者判断文件的权限等。

文件测试的操作选项如下:

选项作用
-d测试是否为目录(directory)
-e测试目录或文件是否存在(exit)
-f测试是否为文件(file)
-r测试当前用户是否有读取权限(read)
-w测试当前用户是否有写入权限(write)
-x测试当前用户是否有可执行权限(excute)
- b测试是否为设备文件
-c测试是否为字符设备文件
-s测试存在且文件大小为空
-L测试是否为链接文件

image-20220701155847675

3、整数比较
整数值比较格式
    	[ 整数1 操作符 整数2 ]
    注:括号需要与整数使用空格分隔

整数值比较操作符如下:

操作符含义
-eq等于(equal)
-ne不等于(not equal)
-lt小于(leser than)
-gt大于(greater than)
-le小于等于(lesser or equal)
-ge大于等于(greater or equal)

image-20220701161625994

4、字符串比较
格式1 [ 字符串1 操作符 字符串2 ]
格式2 [ 选项 字符串 ]

常用的字符串比较操作符和选项

操作符/选项作用
=字符串内容是否相同
!=字符串内容是否不同
-z字符串是否为空

image-20220701162248607

image-20220701162514514

5、逻辑测试
格式1: [ 表达式 ] 操作符 [ 表达式2 ]
格式2: 表达式1 操作符 表达式2
    测试命令返回值为0表示为真,1为假
操作符作用
-a或&&逻辑与
-o或||逻辑或
逻辑非

image-20220701164437598

二、shell的if语句

1、单分支结构
if 条件测试      //用于判断是否执行如下操作
    then 命令合集  // 多条命令组成的集合
fi              // 一个if结构结束的标志

image-20220701164719404

image-20220701170253743

image-20220701170306217

2、双分支结构

如果条件不成立,则执行else后的命令

if 条件测试              //用于判断是否执行then后的命令
    then 命令集合1       
else                   //如果上面的测试不成立,则执行else后面的命令
	命令集合2
fi                     //结束

image-20220701170751208

image-20220701171444166

image-20220701171332902

3、多分支结构
if 条件测试1             //如果条件1成立执行集合1,否者继续向下执行
    then
    命令集合1
elif 条件测试2           //如果条件1不成立,判断条件2是否成立,成立执行集合2,否则向下继续
    then
    命令集合2
else                   //如果以上条件1和条件2都不成立,则执行集合3
    命令集合3
fi

image-20220701172534148

image-20220701174545232

image-20220701174012788

4、if嵌套
if 条件测试1              //用于判断是否执行then后的命令
    then 
    if 条件测试1-1      //用于判断是否执行如下操作
    	then 命令合集1  
	fi             
else                   //如果上面的测试不成立,则执行else后面的命令
	命令集合2
fi                     //结束

例题:判断是否有用户 判断一个用户是否有家目录,有打印正常,没有询问是否需要删除,如果是就删除

#!/bin/bash
# 输入用户名
read -p "请输入正确的用户名:" usr
# 判断用户是否存在
id $usr >/dev/null
if [ $? = 0 ] ; then
#从passwd中提取用户的家目录
   home=$( grep "^$usr:" /etc/passwd | awk -F: '{ print $6 }' )
#查看用户的家目录是否存在
   if [ -d $home ] ; then
     echo "$usr正常"
   else
#询问是否需要删除无家目录的用户
     echo "$usr没有家目录!"
     read -p "请问是否需要删除$usr?(yes or no)" f
#判断是否用户是否需要删除
        if [ $f = yes ] ; then
           userdel $usr
           echo $usr已经被删除
        fi
   fi 
else
#用户不存在提示
   echo "$usr用户不存在,请输入已有用户!"
fi

image-20220702003657470

三、case语句的结构

case多分支结构

case 变量值 in 
模式1)
   命令集合1
;;
模式2)
   命令集合2 
;;
*)
   命令集合3
esac

case语句注意事项
①case行首必须以单词“in”,每一模式必须以单个右括号")"结束

②双分号";;"表示命令序列的结束

③模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以使用竖杠|表示或,比如a|b

最后的”*“)表示默认模式,其中的“*”相当于通配符

例题:使用case 定义一个shell
要求:现学校举行运动会,100米5s-6s的为超人,100米 12-15s为优秀,100米 30s以上的为不及格,其他为意外

#!/bin/bash
read -p "请输入一个成绩:" s
read -p "请输入该学生性别:" x
case "$x" in
男)               //如果性别是男,则进行男生的匹配
        case "$s" in
        [1][0-5])
                echo 优秀
        ;;
        *)
                if [ $s -gt 30 ] ; then
                        echo 不及格
                elif [ $s -lt 10 ] ; then
                        echo 运动员
                else
                        echo 意外
                fi
        esac
;;)          //如果性别是女,则进行女生的规则匹配
        case "$s" in
       [1][1-6] )
                echo 优秀
        ;;
        *)
                if [ $s -gt 30 ] ; then
                        echo 不及格
                elif [ $s -lt 11 ] ; then
                        echo 运动员
                else
                        echo 意外
                fi
        esac
;;
*)  //如果以上都不成立,则表示性别输入错误
        echo 性别不对
esac      //case结构结束的标志

image-20220701181313410

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值