shell脚本基础2——条件语句、分支选择、循环语句

news2024/11/16 6:04:41

文章目录

  • 一、条件语句
  • 二、分支选择
  • 三、循环语句
    • 3.1 for循环
      • 3.1.1 语法一
      • 3.1.2 语法二
    • 3.2 while循环
      • 3.2.1 普通用法
      • 3.2.2 while+if判断循环
      • 3.2.3 特殊用法
    • 3.3 until循环
  • 四、break和continue
    • 4.1 break用法
    • 4.2 continue用法
  • 五、自定义脚本退出状态码

一、条件语句

  • 使用 if 语句做条件判断。
  • 如下示例,判断学生成绩档次。
[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
read -p '请输入成绩:' num
if [  -z  $num   ];then
    echo '输入错误'
    exit
elif [ $num -ge 95  ];then
   echo '优秀'
elif [ $num -ge 90  ];then
   echo '较好'
elif [  $num -ge 80 ];then
   echo '一般'
elif [ $num -ge 60  ];then
  echo '及格'
else
    echo ‘成绩不及格’
fi

在这里插入图片描述

二、分支选择

  • case语句可以进行语句选择。
支持通配符释义
*任意长度任意字符
?任意单个字符
[]指字范围内的任意单个字符
abcbcd

1.如下示例,根据用户输入内容返回对应结果,常用于服务控制。

[root@localhost ~]# cat baimu.sh 
#!/bin/bash
case $1 in
    "name")
        echo "你的名字是:李华"
        ;;
    "age")
        echo "你的年纪是:30岁"
        ;;
    *)                      ##输入内容既不是name,也不是age,则使用星号。
        echo "输入错误,请输入{name|age}"
        ;;
esac

在这里插入图片描述
2.服务控制,设置脚本启动httpd服务。

  1. chkconfig:Centos7支持的参数。设置开机自动,关机停止。

    • 第一个数表示运行级别。
    • 第二个数表示系统开始后第几个启动。
    • 第三个数表示系统关闭第几个关闭服务。
    • 第二个数+第三个数=100
  2. description:表示描述信息

#把脚本文件要入/etc/init.d/目录。
[root@mq init.d]# cat httpd 
#!/bin/bash
# chkconfig: 35 40 60  
# description: start httpd 
case $1 in
    "start")
          /usr/local/httpd/bin/apachectl start
	 ;;
    "stop")
         /usr/local/httpd/bin/apachectl  stop
	 ;;
    "restart")
         /usr/local/httpd/bin/apachectl stop
	 /usr/local/httpd/bin/apachectl start
	;;
    "status")
	status=$(ps -ef|grep "httpd"|grep -Ev "grep|$0 status"|wc -l)    ##grep -v表示取反过滤,-E扩展正则匹配grep或$0 status,wc -l 表示打印符合要求的文本数。
	if [ $status -gt 0 ];then
            echo "httpd is running"
	else
	    echo "httpd is dead"
	fi
	;;
    *)
	echo "usage:start|stop|restart|status"
	;;
esac

#将httpd添加到系统控制。
chkconfig --add httpd

三、循环语句

  • 循环语句有三种,根据场景需要使用合适的循环语句。
    • for循环:当列表不为空时进入循环,否则退出循环。

3.1 for循环

  • 有三种写法,适用场景不一样。
  • 提前知道循环次数时,适用for循环。

3.1.1 语法一

  • 语法一,不需设置变量,常对列表内容进行循环,列表内容循环完毕就退出。

  • 语法格式:

    for 变量 in 列表; do
       循环体
    done
    

1.例一,循环自定义列表,不需要添加任何符号。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
for name in qingjun baimu zhangsan lisi;do
    echo $name
done

在这里插入图片描述
2.例二,循环文件内容。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
for name in $(cat 99.txt);do
    echo $name
done

在这里插入图片描述
3.例三,生成列表循环。2种生成方式:echo {1…10},或者seq [起始数] [步进长度] 结束数,比如seq 1 1 10。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
for age in $(seq 5);do
    echo $age
done

在这里插入图片描述

3.1.2 语法二

  • 语法二,C语言写法,需要设置初始值、退出条件、修正初始值的公式。
  • 语法格式:
    ##写法一。
    for ((expr1;expr2;expr3))
    {
      循环体
    }
    #########################################
    ##写法二。
    for (( expr1 ; expr2 ; expr3 ));do
     循环体
    done
    #########################################
    expr1:用于指定初始条件,给控制变量一个初始值。
    expr2:判定什么时候退出循环。
    expr3:修正expr1指定的变量的值。
    

1.例一,初始值为0,每次循环+1,当值大于10时则退出循环。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
for ((i=0;i<10;i++));do
    echo $i
done

在这里插入图片描述
2.例二,初始值为20,每次循环-1,当值小于等于10时则退出循环。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
for ((i=20;i>10;i--))
{
    echo $i
}

在这里插入图片描述

3.2 while循环

  • while循环适用于循环次数未知的场景,需要有退出条件。
  • 条件满足时进入循环,条件不满足则退出循环。条件编写格式和if语句一样。

语句格式:

while 条件; do
   循环体
done

3.2.1 普通用法

1.例一,循环输出小于等于10的数值。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
age=0
while [ $age -lt 10  ];do
  echo $age
  let age++
done

在这里插入图片描述

3.2.2 while+if判断循环

1.配合if语句循环。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
age=0

while [ $age -lt 10  ];do
  if [ $age -gt 4  ];then
     echo "你今年:" $age岁
     echo ———————————————————
  fi
  let age++
done

在这里插入图片描述

2.配合if语句控制循环。只循环age小于等于5的。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
age=0
state=true
while $state;do
  let age++
  if [ $age -le 5 ];then
     echo "你今年:" $age岁
     echo ——————————————————————————
  else
     state=false
  fi
done

在这里插入图片描述

3.2.3 特殊用法

1.死循环。

##写法一。
[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
age=0
while :;do          ##适用冒号代表真条件,永远循环。
  echo $age
  let age++
done


##写法二。
[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
i=0
while true;do      #也可以写成true。
	echo $i
	let i++	
done

2.先逐行读取已存在的文件内容,将读取的内容赋值给变量line,再进行操作循环。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
age=0
while read line;do             ##read是固定写法。line为变量,其名称可以自定义。
  echo $line
  echo "你今年:$age岁"
  let age++
done  < qingjun1.txt
echo $age

在这里插入图片描述

3.3 until循环

  • 条件不满足时进入循环,条件满足了退出循环,和while循环相反。
  • 不常用。

1.条件成立退出循环,条件不成立才进入循环。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
age=0
until [ $age -ge 10  ];do
  echo $age
  let age+=2
done

在这里插入图片描述

四、break和continue

  • break [num]:提前退出循环,后面的所有循环语句都不会执行,比较常用。
  • continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环。

4.1 break用法

  • 当只有一层循环时,则直接终止后面所有循环;若有多层循环时,则后面跟的数值是从最里面的循环进行限制,而数值之外的循环正常执行。
  • 如下示例,break 1表示对最里面的for循环进行限制,当if条件满足时则终止第2个for循环,会跳过直接进行下轮循环,此时第2个for循环虽终止,但第1个for循环还在正常执行,所以最后输出结果为:第1个for循环会循环完毕,会依次输出[1…10]数值,但第2个for循环每次执行到满足if条件时就会终止,也就是每次只会输出[1…8]数值。
  • 若写成break 2 ,则表示从最里面的for循环数起,限制最里面和最里面往外的第2个for循环,但再往外的第3个…第5个…第n个for循环不会被限制。

1.设置break 1。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
for i in $( seq 10 );do
    echo $i
    for q in $( seq 5 );do
        if [ $q -eq 2 ];then
	   break
	fi
	echo $q
    done
done

在这里插入图片描述

2.设置break 2。此时会直接限制2个for循环,当q大于8时,则里面的for循环不再执行,外面一层的for循环也不执行。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
for i in $( seq 10 );do
    echo $i
    for q in $( seq 5 );do
        if [ $q -eq 2 ];then
	   break 2
	fi
	echo $q
    done
done

在这里插入图片描述

4.2 continue用法

  • continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环

1.当continue=1时。
在这里插入图片描述
2.当continue=2时。

[root@localhost ~]# cat qingjun.sh 
#!/bin/bash
for i in $( seq 10 );do
    echo $i
    for q in $( seq 5 );do
        if [ $q -eq 2 ];then
	   continue 2
	fi
	echo $q
    done
done

在这里插入图片描述

五、自定义脚本退出状态码

  • 常常适用echo $?查询上条命令的执行结果,返回0代表执行成功,其1-255数值说明执行失败。
  • 查询脚本的执行情况时,是返回脚本最后一条命令的执行结果,若脚本中间有条命令执行失败,而最后一条命令执行成功,随后的echo $?也等于0。所以有时候我们是分不清echo $?返回的这个0是不是真的说明脚本执行的没问题,这时候就可以自定义退出状态码。
  • 可以在脚本的最后一行定义一个exit 120,当我们echo $?时,返回的是120,说明脚本执行没问题,才可以执行下一步。
  • 脚本中一旦遇到exit命令,脚本会立即终止。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/634987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XdsObjects .NET 8.45.1001.0 Crack

XdsObjects 是一个工具包&#xff0c;允许开发人员使用 IHE XDS 和 XDS-I 配置文件开发应用程序&#xff0c;只需花费最少的时间和精力&#xff0c;因为遵守配置文件和 ebXML 规则的所有艰苦工作都由该工具包处理。 它为所有角色提供客户端和服务器支持&#xff0c;包括&#…

【Spring MVC】学会这些你就会利用Spring Boot进行前后端交互了,美滋滋,距离编程世界更近一步了,何乐而不为呢 ? ? ?

前言: 大家好,我是良辰丫,! ! !&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&#xff1a;javaEE进阶篇之框架学习 &#x1f34e;励志语句&#xff1a;生活也许会让我们遍体鳞伤&#xff0c;但最终这些伤口会成…

【仪器使用操作笔记】 TDS1012示波器基础原理与使用

今日要学习使用的是一台实验室老旧战损版TDS1012示波器&#xff0c;它长这样&#xff1a; 本文会从以下目录的几个方面全方位介绍示波器的一些基础运用&#xff1a; 目录 一、面板按键旋钮介绍&#xff1a; 整体面板介绍&#xff1a; 示波器探头接线与校准接线&#xff1a; …

一文弄懂java中的代理模式

文章目录 简介静态代理动态代理Cglib代理spring中AOP使用代理总结 简介 代理(Proxy)模式是一种结构型设计模式&#xff0c;提供了对目标对象另外的访问方式&#xff1b;即通过代理对象访问目标对象。 这样做的好处是&#xff1a;可以在目标对象实现的基础上&#xff0c;增强额…

Atcoder Beginner Contest 305——D-F题讲解

蒟蒻来讲题&#xff0c;还望大家喜。若哪有问题&#xff0c;大家尽可提&#xff01; Hello, 大家好哇&#xff01;本初中生蒟蒻讲解一下AtCoder Beginner Contest 305这场比赛的D-F题&#xff01; D题 题外话 安利一波自己的洛谷博客&#xff1a;点这里 思路 这道题还是比…

Hazel游戏引擎(010)预编译头

文中若有代码、术语等错误&#xff0c;欢迎指正 文章目录 前言如何实现 前言 此节目的 由于项目中的头文件或者cpp文件都包含着c的头文件&#xff0c;有些重复&#xff0c;可以将它们包含的c头文件放在一个头文件内&#xff0c;这样不仅使代码简洁&#xff0c;而且预编译头可以…

算法刷题-哈希表-两个数组的交集

两个数组的交集 349. 两个数组的交集思路拓展后记其他语言版本相关题目 如果哈希值比较少、特别分散、跨度非常大&#xff0c;使用数组就造成空间的极大浪费&#xff01; 349. 两个数组的交集 力扣题目链接 题意&#xff1a;给定两个数组&#xff0c;编写一个函数来计算它们的…

Java集合框架:ArrayList详解

目录 一、ArrayList简介 二、ArrayList源码介绍&#xff08;动态扩容以及构造方法是如何实现的&#xff09; 1. 扩容机制&#xff1a; 源码&#xff1a; 源码详解&#xff1a; ​编辑 如何扩容&#xff1a; 2. 扩容源码详解&#xff1a; 三、ArrayList的构造方法 四、ArrayL…

【Linux运维】GitLab本地服务器搭建

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍gitlab本地服务器的搭建。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新…

【JVM内存模型】—— 每天一点小知识

&#x1f4a7; J V M 内存模型 \color{#FF1493}{JVM内存模型} JVM内存模型&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章图文并茂&#x…

MyBatis-plus(2)

实现逻辑查询: 1)and:其实如果只是想实现and查询&#xff0c;只是需要连续调用对应的方法或者是通过wrapper对象实现两次调用即可 2)and的嵌套:假设现在有这样一条语句 select * from user where username"张三" and (age>26 or userID <19)&#xff0c;这条SQ…

使用django的APP在前端上传excel通过post传给后端读取并打印

文章目录 前言前端后端 前言 备研了&#xff0c;博客许久未更了&#xff0c;但是学期末的大作业&#xff0c;遇到了问题并成功解决了&#xff0c;不得不记录一下。 前端 <form method"post" enctype"multipart/form-data" action"/insurance/up…

Hazel游戏引擎(011)窗口抽象和GLFW创建窗口

文中若有代码、术语等错误&#xff0c;欢迎指正 文章目录 前言步骤GIT添加GLFW子模块及编译Window类其它修改 效果Bug记录 前言 此节目的 为了有窗口效果&#xff0c;但不想使用原生的window32写起&#xff0c;所以用glfw窗口库。 也为了完成008计划事件系统的创建窗口部分 图…

AI数据标注工具Doccano

Doccano是一款开源的标注工具&#xff0c;用于自然语言处理和机器学习任务。它提供了用户友好的界面&#xff0c;使用户能够轻松地标注文本、序列标注、文本分类和文本配对等任务。doccano支持多种标注格式&#xff0c;并且可以方便地与其他机器学习工具集成。它的简单性和灵活…

基于 MySQL 事务、隔离级别及 MVCC 机制详细剖析

前言事务特性事务并发引发的问题脏读不可重复读幻读 隔离级别如何更改事务隔离级别 事务基本操作MVCC版本链ReadViewREAD COMMITTED脏读问题不可重复读问题 REPEATABLE READ不可重复读问题幻读问题 小结 总结 前言 MySQL 事务是比较重要且核心的一部分&#xff0c;在操作数据库…

碳排放预测模型 | Python实现基于Prophet网络的碳排放预测模型(预测未来发展趋势)

文章目录 效果一览文章概述研究内容环境准备源码设计学习总结参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于Prophet网络的碳排放预测模型(预测未来发展趋势) 研究内容 这是数据集的链接:https://github.com/owid/co2-data/blob/master/owid-co2-data.csv 使用…

读书:《指数型组织》

《指数型组织》是Salim Ismail在2015年发表的一本著作&#xff0c;它探讨了在今天这个信息时代&#xff0c;一些组织为何能够在极短的时间内取得显著的成绩。他发现这些成功的组织都有一些共享的属性&#xff0c;这些属性使得他们能够比传统组织更快、更有效地扩展业务。他把这…

LiangGaRy-学习笔记-Day21

1、LVM介绍 1.1、LVM是什么 对于生产环境下的服务器来说&#xff0c;如果存储数据的分区磁盘空间不足&#xff0c;应该如何处理&#xff1f; 添加一块硬盘–>可以满足需要再添加一块硬盘也可以满足需求&#xff1b;问题就是拷贝的速度慢&#xff1b; 这里就引入一个技术…

Kubernetes小感

从容器到容器云&#xff0c;谈谈 Kubernetes 的本质&#xff1a; 一个“容器”&#xff0c;实际上是一个由 Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。 作为一名开发者&#xff0c;我并不关心容器运行时的差异。因为&#xff0c;在整个“…

【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(核心组件说明)

零基础全方位带你学习探索Docker容器开发实战指南&#xff08;核心组件说明&#xff09; 核心组件镜像定义概念与容器的关联文件系统root文件系统 bootfs启动文件系统分层存储分层覆盖处理模式镜像的写时复制机制 容器容器进程隔离性容器进程隔离性容器存储层数据卷绑定镜像和容…