Shell编程之循环语句与函数

本文带你探索编程中的条件测试、If语句、case结构,从test命令到文件测试,再到字符串比较与逻辑判断,以及实战案例解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 引言:本章内容将和拐友们一起玩一下编程里的各种函数以及语句的用法。

目录

一.条件测试

1.1.test命令

1.2文件测试之常用的测试操作符

1.3.1格式

1.3.2常见测试操作符

     1.4.字符串比较

1.4.1字符串格式

1.4.1字符串操作符

    1.5逻辑测试

1.5.1逻辑测试的格式

1.5.2常用的测试操作符

二.If语句

2.1单分支结构

2.1.1单分之结构的格式

 2.2双分支结构

2.2.1双分支结构的格式

 ​2.3多分支结构

2.3.1多分支结构的格式

          2.4 if嵌套语句

三.case多分支语句的语法

 3.1.case的概述

 3.2case的格式

 3.3case的实验

 3.3.1检查用户输入的字符类型

 3.3.2编写 apache 启动服务脚本

 3.3.3罚抄案例

 四.总结


一.条件测试

1.1.test命令

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

格式:

  1. test 条件表达式

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

1.2文件测试之常用的测试操作符

常见的测试操作符含义
-d测试是否为目录(directory)
-e测试目录或文件是否存在(Exist)
-f测试是否为文件(File)
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)

-x

测试当前用户是否有权限执行(eXcute)
-b测试是否是设备文件
-c测试是否为字符设备文件
-s测试存在且文件大小为空
-L测试是否为链接文件

1.3.整数值比较 

1.3.1格式

  1. 格式:

  2. [ 整数1 操作符 整数2 ]

1.3.2常见测试操作符

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

1.4.字符串比较

1.4.1字符串格式

  1. [ 字符串1 = 字符串2 ] #判断是否相等

  2. [ 字符串1 != 字符串2 ] #判断是否不等

  3. [ -z 字符串 ] #判断字符串内容是否为空

1.4.1字符串操作符

操作符含义
=字符串内容相同
!=字符串内容不同,!号表示相反的意思
-z字符串内容为空
-n检查是否有字符串存在

 

1.5逻辑测试

1.5.1逻辑测试的格式

  1. [ 表达式1 ] 操作符 [ 表达式2 ]

  2. 命令1 操作符 命令2

1.5.2常用的测试操作符

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

 

 

二.If语句

2.1单分支结构

2.1.1单分之结构的格式

第一种格式:

1.if [ 条件测试操作 ];

2.then 命令序列

3.fi   #注意后面有个结尾,开头结尾要凑成一对否则会报语法错误

第二种格式:

1.if [ 条件测试操作 ];then

2.命令序列

3.fi   

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

案例一 :

 

 案例二:

 同理:

 

 ps注意:

单个括号(【】):必须要有空格  两个字符或数字之间的比较左右必须有空格

条件判断: 
test一种形式,【】中间只能使用=和!=比较字符串,如果使用< 、>需要进行转义\.
然后中间如果比较数字要用-lt 等符号,不能使用 \< 比较数字,他会当成字符串处理

两个括号【【 】】 :可用于处理逻辑命令,也可以处理字符串是否相等,且使用< 、>不用转义符
 

 

2.2双分支结构

2.2.1双分支结构的格式

格式:                                       if  条件

if 条件测试操作                         then

   then  命令序列1                              指令集

   then  命令序列2                     else 

fi                                                         指令集

                                                 if

 

案列1:

-c: ping的次数

-i: 每次多久ping一次,单位是秒

-W :反馈结果的时间,如果不通时可加快反馈时间,单位是秒

 

 案列二:判断输入的用户名是否存在,存在提示已存在,不存在则创建用户并设置密码

1.read -p "请输入你要创建的用户名:" name
2.id $name &>  /dev/null
3.if [ $? -eq 0 ];then
4.        echo "该用户已存在!"
5.else
6.        useradd $name
7.        echo "123" | passwd --stdin $name &> /dev/null
8.        echo "已创建用户$name,并设置密码"
9.fi

  案列三:开启查询apache服务

1.#!/bin/bash
2.netstat -natup | grep ":80"  &>  /dev/null //查询服务检索端口 有没有80端口的服务存在,把输出的信息放到黑洞里
4.if [ $? -eq 0 ];then
5.echo "apache服务已经运行!"
6.else
7.echo "启动httpd服务"
8.yum install -y httpd  &>  /dev/null
9.systemctl start httpd
10.echo "启动完成,欢迎使用Apaceh服务!"
11.fi

 

2.3多分支结构

2.3.1多分支结构的格式

if         条件

then

           指令

elif      条件

then

           指令

else

           指令

fi

 案列一:辨别文件的类别

1.root@localhost home]# vim dome6.sh

2.#!/bin/bash
3.name=/home
4.if [ -d $name ] && [ -r $name ];then
5.   echo "$name 是一个目录并且具有可读权限"
6.elif  [ -f $name ];then
7.   echo "$name 是一个文件"
8.elif [ -b $name ];then
9.   echo "$name 是一个设备文件"
10.else
11.   echo "无法判断文件类别"
12.fi

案例二:根据输入的考试分数不同来区分

#!/bin/bash
read -p "请输入您的分数(0-100): " 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

案列三:罚抄案例

#!/bin/bash
read -p "请输入你的分数: " score
if [ $score -eq 100 ];then
echo "牛皮克拉斯"
elif [ $score -ge 90 ] && [ $score -lt 100 ]
then
echo "$score 分,小牛皮克拉斯,但错的还是得抄10遍!"
elif [ $score -ge 70 -a $score -le 89 ]
then
echo "$score 分,要继续加油哦,错的抄20遍!"
elif [ $score -ge 60 -a $score -le 69 ]
then
echo "$score 分,昨晚搁那梦游呢,错的抄30遍! "
elif [ $score -ge 0 -a $score -lt 60 ]
then
echo "$score 分,刷厕所去吧,所有的全抄30遍 !"
else
echo "输入有误!"
fi

ps:注意不能输入错误的语法哦

 2.4 if嵌套语句

例1.判断httpd服务有没有启动

判断是否启动
如果启动------输出已启动
如果没启动----判断是否安装---如果安装---启动
                           如果没安装----安装---如果安装成功---启动
                                                                 如果安装不成功-----报错
                                       
ps aux | grep httpd | grep -v grep

if [ $? -ne 0 ];then
        if [ "$(rpm -q httpd)" == "未安装软件包 httpd " ];then
        yum -y install httpd
        systemctl start httpd
        else
        systemctl start httpd
        fi
else
        echo "httpd is running"
fi

 

 

三.case多分支语句的语法

3.1.case的概述

case 语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写
case 语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个 不同的条件,而 case 语句只是判断一个变量的不同取值

 3.2case的格式

case 变量值 in

模式 1)

        命令序列 1

;;

模式 2)

        命令序列 1

;;

* )

        默认命令序列

esac

ase 行尾必须为单词“in”,每一模式必须以右括号“)”结束。
  1.双分号“;;”表示命令序列的结束。
  2.模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号 “|”表示或,如“A|B”。 
  3.最后的“*)”表示默认模式,其中的*相当于通配符。

3.3case的实验

3.3.1检查用户输入的字符类型

1.#!/bin/bash
2.read -p "请输入一个字符,并按Enter键确认:" KEY
3.
4.case "$KEY" in
5.[a-z]|[A-Z])
6.echo "你输入的是字母"
7.;;
8.[0-9])
9.echo "你输入的是数字"
10.;;
11.*)
12.echo "你输入的是空格,*,_,等特殊字符"
13.esac

 3.3.2编写 apache 启动服务脚本

1.#!/bin/bash
2.case $1 in
3.start)
4./usr/bin/systemctl $1 httpd
5./usr/bin/ps aux | grep httpd
6.echo "httpd start"
7.;;
8.stop)
9.//usr/bin/systemctl $1 httpd
10./usr/bin/ps aux | grep httpd
11.echo "httpd stop"
12.;;
13.restart)
14.echo "httpd STOP......"
15./usr/bin/ps aux | grep httpd
16./usr/bin/systemctl $1 httpd
17.echo "httpd restart"
18.;;
19.status)
20./usr/bin/systemctl $1 httpd
21.;;
22.*)
23.echo "plases input start|stop|restart|status"
24.esac

 

 3.3.3罚抄案例

1.read -p " 请输入你的分数: " score
2.case $score in
3.100 )
4.echo "秀儿!"
5.;;
6.9[0-9])  //表示90到99
7.echo "$score 分,抄10遍!"
8.;;
9.[78][0-9])   //表示70到89
10.echo "$score 分,抄20遍!"
11.;;
12.6[0-9])   //表示60到69
13.echo "$score 分,抄30遍!"
14.;;
15.[0-9]|[1-5][0-9] )  //表示0-9 和10-59  |表示或
16.echo "$score 分,全抄30遍!"
17.;;
18.*)
19.echo " 输入有误! "
20.esac

 四.总结

1..条件测试的语法 :(文件测试、整数值比较、字符串比较、逻辑测试)

2.if条件语句的语法 :(单分支、双分支、多分支)

3.case多分支语句的语法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值