shell 流程控制之条件判断及案例

news2024/11/18 9:20:50

目录

流程控制之条件判断

一,if条件语句的语法及案例

1,单分支结构

2,双分支结构

3,多分支结构

二,复合指令

三, exit退出程序

四, 多条件判断语句case


流程控制之条件判断

       条件判断语句是一种最简单的流程控制语句。该语句使得程序根据不同的条件来执行不同的程序分支。

一,if条件语句的语法

1,单分支结构

第一种语法:

if <条件表达式>

then

        指令

fi

第二种语法:

if <条件表达式>;then

      指令

fi

单分支示例1

购买英雄,如果金币大于等于6300,显示购买成功;

1,使用命令  vim condition_ctl.sh 打开脚本文件

[root@wangjingjing ~]# vim condition_ctl.sh

2,按照要求编写脚本文件

golden_corn=$1

if test $golden_corn -ge 6300

then

    echo "you got hero yasso successfully!!!"

fi 

3,使用命令  sh condition_ctl.sh 6400  执行脚本文件,结果如下:

[root@wangjingjing ~]# sh condition_ctl.sh 6400

you got hero yasso successfully!!!

单分支示例2

编写脚本,并判断当前脚本执行者,如果不是root用户,提示用户脚本需要root用户来执行,并退出。

1,使用命令  vim su_test.sh  打开脚本文件

[root@wangjingjing ~]# vim su_test.sh

2,按照要求编写脚本文件

if [[ $USER != "root" ]];then
    echo "please switch root user"
fi

3,使用命令 bash su_test.sh 执行脚本文件,结果如下:

(1)当用户为root用户时的结果:

[root@wangjingjing 0131]# bash su_test.sh

 (2)切换用户为普通用户时的结果

[root@wangjingjing 0131]# su redhat
[redhat@wangjingjing 0131]$ bash su_test.sh
please switch root user

2,双分支结构

语法:

if <条件表达式>

then

      指令序列1

else

      指令序列2

fi

双分支示例1

如果金币大于等于6300,显示购买成功,否则,显示金币不够,请充值

1,使用命令  vim condition_ctl.sh 编辑脚本文件

[root@wangjingjing 0131]# vim condition_ctl.sh

2,按照要求编辑脚本文件

golden_corn=$1

if test $golden_corn -ge 6300

then

    echo "you got hero yasso successfully!!!"

else

    echo "golden_corn not enough,please purchase failed,please rechagre!!!"

fi

3,使用命令  sh condition_ctl.sh +参数  执行脚本文件,结果如下:

[root@wangjingjing 0131]# sh condition_ctl.sh 580

golden_corn not enough,please purchase failed,please rechagre!!!

[root@wangjingjing 0131]# sh condition_ctl.sh 78000

you got hero yasso successfully!!!

双分支示例2

判断 sshd 进程是否运行,如果服务未启动则启动相应服务。

1,使用命令  vim ssh_stat.sh  打开脚本文件

[root@wangjingjing 0131]# vim ssh_stat.sh

2,按照要求编辑脚本文件

tips:

-v  反选

wc 统计

#找到sshd的相关进程并统计数量

process_count=`ps -ef | grep sshd | grep -v grep | wc -l`

if [ $process_count -ge 1 ]

then

    echo "service sshd is running"

else

    echo "service sshd is stopped"

# 把输出存放到/dev/null中

    systemctl start sshd >/dev/null

    sleep 3

fi

3,使用命令 bash ssh_stat.sh 执行脚本文件,结果如下:

[root@wangjingjing 0131]# bash ssh_stat.sh

service sshd is running

3,多分支结构

语法:

if 条件表达式1

then

       命令序列1

elif 条件表达式2

then

       命令序列2

elif 条件表达式3

then

       命令序列3

else                                        (    此处的else 可有可无   )

       命令序列n

Fi

       在上面的语法中,当整个if elif语句结构中的第1个条件表达式为真,则执行第1个then子句中的语句 statement1;否则,继续下面的判断。如果条件表达式2的值为真,则执行第2个then子句中的语句,以此类推。如果所有的条件表达式的值都为假,则执行最后的else子句中的语句。最后是if elif结构的结束 标志fi。

多分支示例1

判定一个成绩:

85-100 -》 A

70-84 -> B

60-69 -> C

0-59 ->D

程序的边界问题:>100, <0

必须输入的是数字:0-100

假设:输入成绩的人是可靠的,输入的成绩都是有效的

1,使用命令 vim score_script.sh 编辑脚本文件

[root@wangjingjing 0131]# vim score_script.sh

2,按照要求编辑脚本文件

score=$1

if [ $score -ge 85 -a $score -le 100 ]

then

    echo "LEVEL A"

elif [ $score -ge 70 -a $score -lt 85 ]

then

    echo "LEVEL B"

elif [ $score -ge 60 -a $score -lt 70 ]

then

    echo "LEVEL C"

elif [ $score -ge 0 -a $score -lt 60 ]

then

    echo "LEVEL D"

else

    echo "wrong score"

fi

3,使用命令  bash score_script.sh +参数  执行脚本文件,结果如下:

[root@wangjingjing 0131]# bash score_script.sh 100

LEVEL A

[root@wangjingjing 0131]# bash score_script.sh 76

LEVEL B

[root@wangjingjing 0131]# bash score_script.sh 65

LEVEL C

[root@wangjingjing 0131]# bash score_script.sh 26

LEVEL D

[root@wangjingjing 0131]# bash score_script.sh 101

wrong score

[root@wangjingjing 0131]# bash score_script.sh -1

wrong score

多分支示例2:

判断cpu是那个类型的

tips:

[[]] -> 支持正则表达式匹配: =~

查看主机的cpu生产商:cat /proc/cpuinfo

1,使用命令 vim cpu_script.sh 编辑脚本文件

[root@wangjingjing 0131]# vim cpu_script.sh

2,按照要求编辑脚本文件

#在文件/proc/cpuinfo 中找到唯一一个vendr_id

cpu_type=`grep "vendor_id" /proc/cpuinfo | uniq`

#使用正则表达式匹配到AuthenticAMD

if [[ $cpu_type =~ AuthenticAMD ]]

then

    echo "CPU Type is AMD"

#使用正则表达式匹配到GenuineIntel   

elif [[ $cpu_type =~ GenuineIntel ]]

then

    echo "CPU Type is Intel"

else

    echo "CPU Type is other"

fi

3,使用命令 bash cpu_script.sh 执行脚本文件,结果如下:

[root@wangjingjing 0131]# bash cpu_script.sh

CPU Type is Intel

 

二,复合指令

复合指令:即一串命令。

()和{}都是对一串的命令进行执行,但有所区别:

相同点:

        ()和{}都是把一串的命令放在括号里面,如果命令在一行命令之间用;号隔开;

                 ()和{}括号里面某个命令的重定向只影响该命令,但括号外的重定向则

                 会被括号里的所有命令影响。

不同点

()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行;

     ()最后一个命令可以不用分号,{}最后一个命令要用分号;

     ()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格。

举例:

()和{}都是把一串的命令放在括号里面,如果命令在一行命令之间用;号隔开;

()最后一个命令可以不用分号,{}最后一个命令要用分号

()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必须要有一个空格

{}注意空格和分号

[root@wangjingjing 0131]# { pwd;ls;echo "123";}

/root/shell_code23/0131

23  condition_ctl.sh  dir1   file_test.sh  num_test.sh      ssh_stat.sh

44  cpu_script.sh     file1  num_test2.sh  score_script.sh  su_test.sh

123

()

[root@wangjingjing 0131]# (pwd;ls;echo "123")

/root/shell_code23/0131

23  condition_ctl.sh  dir1   file_test.sh  num_test.sh      ssh_stat.sh

44  cpu_script.sh     file1  num_test2.sh  score_script.sh  su_test.sh

123

  

()多行书写:

[root@wangjingjing 0131]# (pwd

> ls

> echo "123"

> )

/root/shell_code23/0131

23  condition_ctl.sh  dir1   file_test.sh  num_test.sh      ssh_stat.sh

44  cpu_script.sh     file1  num_test2.sh  score_script.sh  su_test.sh

123

{ }多行书写:       注意开始的空格

[root@wangjingjing 0131]# { pwd

> ls

> echo "123"

> }

/root/shell_code23/0131

23  condition_ctl.sh  dir1   file_test.sh  num_test.sh      ssh_stat.sh

44  cpu_script.sh     file1  num_test2.sh  score_script.sh  su_test.sh

123

()和{}括号里面某个命令的重定向只影响该命令,但括号外的重定向则会被括号里的所有命令影响。

括号里面使用

[root@wangjingjing 0131]# { pwd;ls;echo "123" > file.txt; }

/root/shell_code23/0131

23  condition_ctl.sh  dir1   file_test.sh  num_test.sh      ssh_stat.sh

44  cpu_script.sh     file1  num_test2.sh  score_script.sh  su_test.sh

[root@wangjingjing 0131]# more file.txt

123

括号外面使用:

[root@wangjingjing 0131]# { pwd;ls;echo "123"; } > file.txt

[root@wangjingjing 0131]# more file.txt

/root/shell_code23/0131

23

44

condition_ctl.sh

cpu_script.sh

dir1

file1

file_test.sh

file.txt

num_test2.sh

num_test.sh

score_script.sh

ssh_stat.sh

su_test.sh

123

()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行;

小括号:

[root@wangjingjing 0131]# (pwd;ls;echo "123";sleep 200;)

/root/shell_code23/0131

23  condition_ctl.sh  dir1   file_test.sh  num_test2.sh  score_script.sh  su_test.sh

44  cpu_script.sh     file1  file.txt      num_test.sh   ssh_stat.sh

123

 

 

大括号:

[root@wangjingjing 0131]# { pwd;ls;echo "123";sleep 200; }

/root/shell_code23/0131

23  condition_ctl.sh  dir1   file_test.sh  num_test2.sh  score_script.sh  su_test.sh

44  cpu_script.sh     file1  file.txt      num_test.sh   ssh_stat.sh

123

 

 

 

 

三, exit退出程序

        exit语句的基本作用是终止Shell程序的执行。除此之外,exit语句还可以带一个可选的参数,用来指定程 序退出时的状态码。

exit语句的基本语法如下:

 exit status

        其中,status参数表示退出状态,该参数是一个整数值,其取值范围为0~255。与其他的Shell命令一 样,Shell程序的退出状态也储存在系统变量$?中,因此,用户可以通过该变量取得Shell程序返回给父进 程的退出状态码

四, 多条件判断语句case

case语句语法:

case 变量名 in

     值1)

        指令1

      ;;

     值2)

        指令2

      ;;

     值3)

        指令3

      ;;

        *)

          默认

esac

        case语句会将该变量的值与每个值相比较,如果与某个值相等,则执行该value所对应的一组语句。当遇 到“;;”符号时,就跳出case语句,执行esac语句后面的语句。如果没有任何一个值与variable的值相匹 配,则执行*后面的一组语句。

示例1

输入1,打印1,输入2,打印2……

1,使用命令 vim case_script.sh 编辑脚本文件

[root@wangjingjing 0131]# vim case_script.sh

2,按照要求编辑脚本文件

num=$1

case $num in

    1)

        echo "1"

    ;; 

    2)

        echo "2"

    ;; 

    3)

        echo "3"

    ;; 

    4)

        echo "4"

    ;; 

    *)

        echo "other number"

    ;;

esac

3,使用命令  bash case_script.sh+参数  执行脚本文件,结果如下:

[root@wangjingjing 0131]# bash case_script.sh 1

1

[root@wangjingjing 0131]# bash case_script.sh 2

2

[root@wangjingjing 0131]# bash case_script.sh 3

3

[root@wangjingjing 0131]# bash case_script.sh 4

4

[root@wangjingjing 0131]# bash case_script.sh 6

other number

示例2

由用户从键盘输入一个字符,并判断该字符是否为字母、数字或者其他字符, 并输出相应的提 示信息。

1,使用命令 vim case_script2.sh 编辑脚本文件

[root@wangjingjing 0131]# vim case_script2.sh

2,按照要求编辑脚本文件

char=$1

case $char in

    [a-z] | [A-Z])

        echo "letter"

    ;; 

    [0-9])

        echo "number"

    ;; 

    *)

        echo "other char"

esac

3,使用命令  bash case_script2.sh+参数  执行脚本文件,结果如下:

[root@wangjingjing 0131]# bash case_script2.sh 1

number

[root@wangjingjing 0131]# bash case_script2.sh a

letter

[root@wangjingjing 0131]# bash case_script2.sh A

letter

[root@wangjingjing 0131]# bash case_script2.sh #

other char

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

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

相关文章

【SpringCloud】Sentinel 之隔离与降级

一、上集回顾上级文章地址&#xff1a;【SpringCloud】Sentinel 之流量控制_面向架构编程的博客-CSDN博客上一篇文章我们讲解了Sentinel 流量控制、流控效果、热点参数限流的用法&#xff0c;统称为限流&#xff0c;它是一种预防措施&#xff0c;可以尽量避免因高并发而引起的服…

根据官方文档详细说明 Kubernetes 网络流量走向,包含详细的图文说明和介绍

根据官方文档详细说明 Kubernetes 网络流量走向&#xff0c;包含详细的图文说明和介绍。 阅读本文&#xff0c;你可以了解在 Kubernetes 内外&#xff0c;数据包是如何转发的&#xff0c;从原始的 Web 请求开始&#xff0c;到托管应用程序的容器。 Kubernetes 网络要求 在深入…

【three.js】本地搭建Threejs官方文档网站 解决threejs官方文档打开过慢得到问题

本文主要为了解决three.js 官方文档 打开过慢的问题 因为Three.js官网是国外的服务器&#xff0c;所以为了方便学习和快速的查阅文档&#xff0c;我们可以自己搭建Three.js官网和文档&#xff0c;方便随时查看案例和文档内容进行学习。 1、首先进入threejs库GitHub地址&#xf…

如何成为一名FPGA工程师?需要掌握哪些知识?

我国每年对于FPGA设计人才的需求缺口很大。在需求缺口巨大的情形下&#xff0c;发展前景相对可观。那么如何成为一名FPGA工程师&#xff1f; 什么是FPGA&#xff1f; FPGA&#xff08;FieldProgrammable Gate Array&#xff09;&#xff0c;即现场可编程门阵列&#xff0c;它…

新手入门Pinia

什么是Pinia Pinia 是 Vue 的专属状态管理库&#xff0c;它允许你跨组件或页面共享状态。它和Vuex作用类似(发音为 /piːnjʌ/),官网 为什么要使用Pinia 与 Vuex 相比&#xff0c;Pinia 不仅提供了一个更简单的 API&#xff0c;也提供了符合组合式 API 风格的 API&#xff0…

vue项目创建

前提&#xff1a;node安装&#xff1a;02node安装_哔哩哔哩_bilibili 1. 查看node版本 查看node版本 node -v 查看npm 版本 npm -v 2. 输入cmd 用管理员打开控制台 3. 设置淘宝镜像 npm config set registry https://registry.npm.taobao.org 4. 安装vue脚手架 npm install -g …

北大青鸟昌平校区:2023年云计算发展趋势!

云计算的大规模应用一直是许多最具变革性技术——如人工智能、物联网等的关键驱动力&#xff0c;未来也将进一步推动虚拟现实和增强现实(VR/AR)、元宇宙、甚至量子计算等技术的发展。近日&#xff0c;在美国《福布斯》网站报道中&#xff0c;列出了2023年云计算领域的五大主要趋…

56.Isaac教程--ROS

ROS ISAAC教程合集地址文章目录ROS安装ROS创建和使用自定义 ROS 包创建 ROS BridgeRos节点时间同步器消息转换器基地姿势同步自定义小码示例&#xff1a;将 ROS 导航堆栈与 Isaac 结合使用在此示例上构建将 Isaac 映射转换为 ROS 映射Isaac 和机器人操作系统 (ROS) 都使用消息传…

other-chatGPT记录

title: other-chatGPT记录 categories: Others tags: [人工智能, ai, 机器人, chatGPT] date: 2023-02-02 10:04:33 comments: false mathjax: true toc: true other-chatGPT记录 前篇 官网 https://openai.com/api - https://openai.com/api/测试 - https://platform.openai.…

DSP_CCS7实现变量的导出与MatLAB读取

前言 最近在做基于dsp平台的无通信接口系统辨识&#xff0c;因此需要直接利用CCS将数据导出&#xff0c;然后再利用MatLAB解析读取后的数据。MatLAB的代码参考了以下这篇链接: -/导出CCS3.3数据及使用matlab处理的方法.md at master dailai/- GitHub 高版本的CCS&#xff…

GitHub访问问题与 Steam++下载及使用(适合小白)

前言 &#x1f4dc; “ 作者 久绊A ” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴 ​ 目录 前言 一、Steam的介绍 1、大概介绍 2、详细介绍 二、Ste…

Unity与Android交互(双端通信)

前言 最近小编开始做关于手部康复的项目&#xff0c;需要Android集成Unity&#xff0c;以Android为主&#xff0c;Unity为辅的开发&#xff1b;上一篇给大家分享了Unity嵌入Android的操作过程&#xff0c;所以今天想给大家分享一下双端通信的知识&#xff1b; 一. Android与Un…

安装OpenResty

安装OpenResty 1.安装 首先你的Linux虚拟机必须联网 1&#xff09;安装开发库 首先要安装OpenResty的依赖开发库&#xff0c;执行命令&#xff1a; yum install -y pcre-devel openssl-devel gcc --skip-broken2&#xff09;安装OpenResty仓库 你可以在你的 CentOS 系统中…

物联网平台+业务平台基本架构设计与优化想法

前言 目前的交付底座有点老&#xff0c;而且集成的有点杂&#xff0c;计划是要升级下&#xff0c;先说想法&#xff0c;看领导做不做。 1 业务平台定位 我们的愿景&#xff1a;通过物联平台赋能&#xff0c;让数据产生价值。 为客户提供可视化的平台&#xff08;数据价值…

【王道数据结构】第二章 | 线性表

目录 2.1线性表的定义 2.2线性表的基础操作 2.3顺序表的定义 2.4顺序表的基本操作 2.5 线性表的链式表示 2.1线性表的定义 线性表是具有相同数据类型的n(n>0)个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个空表。若用L命名线性表&#xf…

Block底层原理读书笔记-《高级编程- iOS与OS多线程和内存管理》(更新中)

1 一个Block 真正的底层都有些什么&#xff1f; Block会被解析成一个结构体&#xff08;这里成为Block结构体&#xff09;&#xff0c;这个结构体里有&#xff1a; &#xff08;1&#xff09;isa指针&#xff08;说明Block的本质是一个对象&#xff09;&#xff1a;指向Stack…

动态修改Azure DevOps区域路径或迭代路径的继承权限(Inhertiance)

Contents1. 场景描述2. 解决方案2.1 更改继承的接口&#xff1a;ChangeInhertiance2.2 获取区域路径的接口&#xff1a;ClassificationNodes1. 场景描述客户使用工作项模板&#xff0c;定制了一个设计变更流程&#xff0c;需要在不同的阶段(流程状态)控制工作项的更改权限。我们…

Grafana 系列文章(六):Grafana Explore 中的日志

&#x1f449;️URL: https://grafana.com/docs/grafana/latest/explore/logs-integration/#labels-and-detected-fields &#x1f4dd;Description: Explore 中的日志 除了指标之外&#xff0c;Explore 还允许你在以下数据源中调查你的日志。 ElasticsearchInfluxDBLoki 在基…

[算法设计与分析考点4] 改进的串匹配算法——KMP算法

算法核心思想 在BF算法的基础上加以改进&#xff0c;BF算法中每次当前字符不相等时&#xff0c;主串S要回溯到其下一个字符处&#xff0c;模式串T要回溯到 j0 位置进行下一趟的匹配。然而&#xff0c;大多数情况下&#xff0c;这种回溯是没有必要的&#xff0c;非常耗时且效率低…

qt入门介绍

1.Qt 是一个跨平台的 C开发库。主要用来开发图形用户界面&#xff08;GUI&#xff09;程序。Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控件、布局、交互&…