Linux_Shell判断循环,函数实例,状态码-07

news2024/9/24 3:22:41

一:分支语句

==结束语句等于开始语句得单词反着写==

1.1 if语句

if 表达式 then
	逻辑处理
elif 表达式 then
	逻辑处理
else
	逻辑处理
fi

1.1.1 单支语句

1.1.2 双分支语句

1.1.3 多分支语句

1.2 case条件结构语句

1.2.1 case语法结构

case 表达式 in
值)
;;
esac

1.2.2 case与if的对比

case书写方式

case $name in
 值1) 
   指令1
   ;;
 值2) 
   指令2
   ;;
  *) 
   指令
esac

1.2.2 case与if的对比

case书写方式

case $name in
 值1) 
   指令1
   ;;
 值2) 
   指令2
   ;;
  *) 
   指令
esac

if书写方式

if [ $name == "值1" ]
 then 
  指令1elif [ $name == "值2" ]
 then 
  指令2
 else
  指令   
fi

1.2.3 case值的书写方式

apple)
   echo -e "$RED_COLOR apple $RES"
   ;;

可以这样写,输入2种格式找同一个选项

apple|APPLE)
   echo -e "$RED_COLOR apple $RES"
   ;;

*)
   echo -e "$RED_COLOR apple $RES"
   ;;

二:循环语句

2.1 for循环

2.1.1 列表for循环(常用)        

#!/bin/bash

for i in 取值列表 do

  循环主体/命令
done

 

2.1.2 类似C语言的风格

for((exp1;exp2;exp3))
  do
   指令...done  

编写类似C语言风格脚本

Shell中的两种样式

2.2 while语法

while:当...时候,满足条件执行

基本结构:

while 条件
 do
	命令
done

2.3 until循环

until:直到...时候,不满足条件执行

基本结构

until condition
	do
  	do something...
done

2.4 跳出循环

shell中也支持break跳出循环, continue跳出本次循环.用法与C, Java中相同

                     

三、函数

Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。

Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。

3.1 基本语法

function name() {
    statements
    [return value]
}

对各个部分的说明:

  • function是 Shell 中的关键字,专门用来定义函数;

  • name是函数名;

  • statements是函数要执行的代码,也就是一组语句;

  • return value表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。

  • 由包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

3.2 函数定义的简化写法

如果嫌麻烦,函数定义时也可以不写 function 关键字:

name() {
    statements
    [return value]
}

如果写了 function 关键字,也可以省略函数名后面的小括号:

function name {
    statements
    [return value]
}

建议使用标准的写法,这样能够做到“见名知意”,一看就懂。

3.3 函数调用

调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:

name

如果传递参数,那么多个参数之间以空格分隔:

name param1 param2 param3

不管是哪种形式,函数名字后面都不需要带括号。

示例一:

定义一个函数

#!/bin/bash

add(){
	echo '加法计算'
}

add

可以将调用放在定义的前面,也就是写成下面的形式:

#!/bin/bash

add

add(){
	echo '加法计算'
}

示例三

#!/bin/bash

dev(){
	echo '减法计算'
	a=$1
	b=$2
	echo ${a}-${b}=$((a-b))
}

dev 4 2

示例三

使用 $@ 来遍历函数参数,定义一个函数,计算所有参数的和:

#!/bin/bash

getsum(){
    local sum=0
    for n in $@
    do
       ((sum+=n))
    done
    return $sum
}

#调用函数并传递参数
getsum 10 20 30 40 50  
echo $?

四、状态码

Shell 中运行的命令会使用0-255之间的整数值,作为退出状态码,并以此来告知shell该命令执行的状态。通常情况下,约定0代表命令成功结束,非0代表程序非正常退出

典型退出状态码及其含义
退出状态码含义
0命令运行成功
1通知未知错误
2误用shell命令
126命令不可执行
127没有找到命令
128无效退出参数
128+xlinux信号x的严重错误
130命令通过Ctrl+C终止
255退出状态码越界
  1. $?:返回上一条语句或脚本执行的状态

  • 0:成功

  • 1-255:不成功

  1. exit 命令,用于退出脚本或当前Shell

exit 命令n 是一个从 0 到 255 的整数 ,0 表示成功退出,非零表示遇到某种失败 ,返回值被保存在状态变量 $? 中

exit  n

4.1 示例

示例一:

未指定函数返回值,且函数最后一条命令执行成功

#!/bin/bash

hello(){
  echo "Hello World"
  # cho "Hello World"
}

hello
echo '命令执行结果:'$?
#!/bin/bash

hello(){
  # echo "Hello World"
  cho "Hello World"
}

hello
echo '命令执行结果:'$?

说明:由于此时未指定返回值,所以以函数最后一条被执行的命令echo "Hello World";的执行状态作为函数的退出状态。此时 echo "Hello World";执行成功,所以返回0作为退出状态码。

示例二

指定函数返回值,|外

#!/bin/bash

hello(){
  echo "Hello World"
  # 函数返回值在约定范围内
  return 3
  # 函数返回值在约定范围外 
  # return 333
}

hello
echo '命令执行结果:'$?

说明:hello函数指定了函数返回值为333,由于260超出了0~255,所以需要对指定的返回值进行一次取模运算,所以退出状态码由333变更为77。

示例三

指定函数返回值,但返回值前发生命令报错

函数中一条命令执行报错并不会影响后续代码的执行

#!/bin/bash

hello(){
  # echo "Hello World"
  cho "Hello World"
  echo "结束"
  return 3
}

hello
echo '命令执行结果:'$?

运行以后再次输入echo $?

由于hello函数指定了退出状态码,所以第一次输出的退出状态码为指定的整数3;第二次退出状态码则取脚本中最后一条命令echo $?命令的执行状态,由于脚本中的echo $?成功执行,所以第二次读取的退出状态码为0。

示例四

使用exit退出程序

read -p '请输入成绩:' str
if [ $str -lt 100 ] 
then
	echo '正确:'$str
	exit 0
else
	echo '错误'
	exit 111
fi

4.2 利用退出状态码实现命令的重试

思路:

1、 利用退出状态码,可以判断命令是否成功执行

2、 利用循环语句,可以实现命令的重试

3、 如果只设置退出状态码为0作为唯一的循环退出条件,可能出现死循环,所以最好增加最大重试次数的控制逻辑

4、$?是一个即使变化的值,如果需要多次使用,最好赋值给一个变量

#!/bin/sh

#记录重试次数
count=0

while [ 0 -eq 0 ]
do
  echo ".................. job begin ..................."
  # date
  dat
  flag=$?
  echo "\$?"=${flag}
  if [ ${flag} -eq 0 ]; then
    echo "--------------- job complete ---------------"
    break;
  else
    count=$[ ${count}+1 ]
    if [ ${count} -eq 6 ];then
      echo "--------------- job failed ---------------"
      break;
    fi
    echo "............error occur, retry in 60 seconds,count=${count} .........."
    # sleep 60
  fi
done

运行结果 :

当退出状态码非0时,代码中[ 0 -eq 0 ][${flag}-eq 0 ]部分实现了重试功能;[${count}-eq 6 ]部分实现了对重试逻辑不得超过6次的控制

4.3 小结

Shell退出状态码:

  • 假如没有指定返回值,那么会用脚本的最后一个命令的执行状态,作为退出的状态码,支持用exit命令指定退出码。退出的状态码范围是0~255,如果自定义的退出码不在范围内,会对其执行取模运算;

  • 假如执行的是一个有返回值的函数或者程序,那么执行结束的返回值会被当做当前函数或程序的退出状态值。

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

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

相关文章

Redis14-缓存同步

目录 缓存同步策略 安装Canal 监听Canal 缓存同步策略 缓存数据同步的常见方式有三种: 1.设置有效期:给缓存设置有效期,到期后自动删除,再次查询时更新 优势:简单、方便缺点:时效性差,缓存…

【CPP】CPP的STL(前篇)

目录 12 STL(前篇)12.1 什么是STL12.2 string类12.2.1 什么是string12.2.2 string类的构造函数12.2.3 string类的析构函数12.2.4 string类的[]重载12.2.5 string类的迭代器的简单了解12.2.6 auto关键字12.2.7 范围for12.2.8 反向迭代器 -- reverse12.2.9 const迭代器12.2.10 CP…

superset定制化配置修改总结

1.需要想用iframe引入dashboard时, URL 参数可用于修改仪表板的呈现方式,standalone0 属性枚举描述standalone0仪表盘正常显示1顶部导航已隐藏2顶部导航 标题被隐藏3顶部导航 标题 顶级标签被隐藏show_filters0渲染没有过滤栏的仪表板1(默…

深度学习 —— 个人学习笔记16(目标检测和边界框、目标检测数据集)

声明 本文章为个人学习使用,版面观感若有不适请谅解,文中知识仅代表个人观点,若出现错误,欢迎各位批评指正。 三十二、目标检测和边界框 import torch import matplotlib.pyplot as plt from matplotlib_inline import backend_…

Python爬虫开发:BeautifulSoup、Scrapy入门

在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非…

CVE-2024-38077:Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略

文章目录 CVE-2024-38077:Windows远程桌面授权服务的‘隐形杀手’——深度剖析与紧急防护策略1 漏洞描述2 漏洞影响2.1 处置优先级:高2.2 影响版本 3 漏洞检测3.1 漏洞检测工具3.2 漏洞检测工具使用介绍3.2.1 漏洞检测工具当前支持三种方式检测3.2.2 漏洞…

常见的三个事务问题(脏读/幻读/不可重复读)

常见的三个事务问题(脏读/幻读/不可重复读) 脏读 脏读(Dirty Read)是指在一个事务中,读取了另一个未提交事务的数据。 具体来说,脏读的过程如下: 1. 事务A开始,对某一行数据进行…

C++学习笔记之数组

C学习笔记之数组 https://www.runoob.com/cplusplus/cpp-arrays.html C当中,数组是用于存储固定大小的相同类型元素的顺序集合 数组是整体作为一个变量,其中又包含多个单独变量,作为其元素,如数组变量a,其包含a[0]~a[…

html+css+js网页制作 淘宝首页1个页面带js

htmlcssjs网页制作 淘宝首页1个页面带js 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&…

【并查集、树的直径】P2195 HXY造公园 题解

题意 P2195 codeforces 455c,两道一样的题 给出一个由 n n n 个点, m m m 条边组成的森林,有 q q q 组询问,每次询问有以下两种情况 输入 o p 1 op 1 op1 时:给出点 x x x,输出点 x x x 所在的树的直径。 输…

千元不到,作为可穿戴AI设备,AI Friend真的能够取代手机吗?

在人工智能的浪潮中,我们见证了无数旨在提高效率和生产力的创新设备。 然而,Friend设备以其独特的设计理念,为AI设备带来了新的定义——一个永远在线的伴侣,一个情感的稳定器。 一、Friend的设计理念 Friend设备的设计初衷并非追…

vscode的C/C++环境配置和调试技巧

目录 1.背景 2.下载编译器 3.配置环境变量 4.安装C/C插件 5.写C语言代码并且编译成功 5.1文件操作 5.2对于两个窗口的解释 5.3C语言编译环境配置 6.创建执行文件 7.编译运行过程 8.写其他的代码的解决方案一 9.写其他的代码的解决方案二 10.同时编译多个.c文件 10…

Qt 中实现异步散列器

【写在前面】 在很多工作中,我们需要计算数据或者文件的散列值,例如登录或下载文件。 而在 Qt 中,负责这项工作的类为 QCryptographicHash。 关于 QCryptographicHash: QCryptographicHash 是 Qt 框架中提供的一个用于生成加密散列…

【系统维护】Dll文件修复工具使用教程,Windows系统必备!

一、dll文件是什么 dll文件是是一种Windows操作系统下的可执行文件格式,包含可由多个程序同时使用的代码和数据的文件,它的主要作用是实现代码和数据的共享,从而节省内存和硬盘空间,并提高程序的性能和可维护性 二、如何解决dll文…

刚刚,模糊测试平台SFuzz受到行业认可

近日,中国网络安全产业联盟(CCIA)正式发布了“2024年网络安全优秀创新成果大赛-安全严选专题赛”评选结果,开源网安模糊测试平台SFuzz凭借重大创新能力,得到组委会认可,获本次大赛创新产品优胜奖。 2024年网…

【LeetCode面试150】——392判断子序列

博客昵称:沈小农学编程 作者简介:一名在读硕士,定期更新相关算法面试题,欢迎关注小弟! PS:哈喽!各位CSDN的uu们,我是你的小弟沈小农,希望我的文章能帮助到你。欢迎大家在…

数据结构--第八天

--哈希表 -哈希表的概念 哈希表:用散列法存储的线性表被称为哈希表,使用的函数被称为散列函数或者哈希函数,f(k)被称为散列地址或者哈希地址。。通常情况下,散列表的储存空间是一个一维数组,而哈希地址为数组的下标 -哈…

【C# WPF】Style全局样式和资源字典

1.全局样式&#xff1a; 在Window.Resource中声明一个样式&#xff0c;总体为白色&#xff0c;为了更有区分度&#xff0c;采用BasedOn这一继承方式来在保留字体和边缘设置的基础上&#xff0c;更改颜色。 <Window x:Class"WpfApp1.Window1"xmlns"http://s…

LangChain 推出 LangGraph Studio:首款用于可视化、交互和调试复杂代理应用的代理 IDE

嘿&#xff0c;听说了吗&#xff1f;Langchain最近发布了一项重大更新&#xff0c;他们推出了官方Agent IDE&#xff0c;并且免费开放了LangGraph平台。这对于AI开发者来说是个好消息&#xff0c;意味着我们现在有了更强大的工具来构建智能应用。 今天&#xff0c;我们就来分享…

CI/CD——CI持续集成实验

目录 一. 安装Docker 二. 部署Jenkins 三. 配置邮箱 四. Harbor部署 五. Nexus Repository部署 五. sonarqube安装 六. 配置Docker 七. jenkins系统配置sonarqube 八. 配置pipeline 九. 构建并集成 一. 安装Docker docker-ce镜像_docker-ce下载地址_docker-ce安装教程…