Linux中shell脚本——for、while循环及脚本练习

目录

一.for循环

1.1.基本格式

1.2.类C语言格式

二.while循环

2.1.基本格式

2.2.死循环语句

三.跳出循环

3.1.continue跳出循环

3.2.break跳出循环

四.常用循环

4.1.循环打印九九乘法表

4.2.循环ping测试某个网段网络连通性

4.3.while死循环实现猜数字游戏

4.4.数字累加脚本(1-100) 


一.for循环

1.1.基本格式

for   变量名称(注意是名称不是变量$等)    [  in   名称范围  ] (可以不写)

do   

执行内容    若满足循环则做什么动作

done    for循环结束标志

练习:

vim  sb.sh              #创建脚本sb.sh
脚本内容:
#!/bin/bash
for  i   in  {1..10}    #for循环10次,第一次i=1,第二次i=2以此类推直到i=10
do
echo "$i"               #循环动作,每次输出$i 
done                    #for语句结束标志bash  sb.sh             #调用shell执行脚本sb.sh

 

1.2.类C语言格式

for (( 表达式1 ;表达式2;表达式3   ))

do

执行内容         #若满足循环则做什么动作

done                #for循环结束标志

表达式1:定义变量并赋值

表达式2:决定是否循环

表达式3:决定循环变量如何改变,决定循环什么时候结束

练习:

vim kk.sh                  #创建脚本kk.sh
脚本内容:
#!/bin/bash
for(( i=0;i<=10;i++ ))     #定义for循环i变量初始值为0,循环条件i小于等于10,每循环一次i自加1
do
echo "$i"                  #for循环每循环一次执行一次输出$i
done                       #for语句结束标志bash kk.sh                 #调用shell执行脚本

 

二.while循环

2.1.基本格式

用于不知道循环次数,需要主动结束循环或达到条件结束循环。

while   [ 判断条件] 使用while循环满足条件执行do,不满足不执行 

do       

执行动作   while循环执行动作

done         while循环结束标志

练习:

vim  ll.sh               #创建脚本ll.sh
脚本内容:
#!/bin/bash
i=0
while [ $i -le 10  ]     #变量i小于等于10时执行while循环
do
echo "$i"                #循环执行内容,每循环一次打印$i
let i++                  #每循环一次计算一次i++ 即i自己+1
done                     #while语句结束标志 bash  ll.sh              #调用bash执行ll.sh脚本

2.2.死循环语句

①while  [1  -eq  1]            #判断条件写一个永久为真的条件

    do                                 # 一直执行do内的命令

    done                     

②while  true                     #直接写判断条件为真

    do                                 #一直执行do内的命令

    done                         

③while :                           #判断条件为冒号也表示死循环

    do                                 # 一直执行do内的命令

    done                             #while语句结束标志

三.跳出循环

3.1.continue跳出循环

表示满足continue条件时跳出循环,但是不影响后续循环执行

vim qq.sh         #创建脚本qq.sh
脚本内容:
#!/bin/bash
for i in {1..5}  #for循环5次从i=1开始到i=5
do
if [ $i -eq 3 ]  #if判断语句,若$1等于3则执行then的内容
then 
continue         #当$i=4时跳出循环但不影响后面循环  
fi               #结束if语句
echo "$i"        #没执行一次for循环输出一次$i
done             #for循环结束语句bash qq.sh       #调用shell执行脚本

 

3.2.break跳出循环

在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。

break  [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,若为3则结束自己所在循环和外边嵌套的2层循环

举例:
vim   o.sh     #创建o.sh脚本
脚本内容:
#!/bin/bash
for j in {1..3}      #第一层for循环,j=1,2,3各执行一次do的内容
do                   #第一层for循环的执行内容for i in {1..5}  #第二层for循环,i=1,2,3,4,5各执行一次do的内容do               #第二层for循环的执行内容  if [ $i -eq 3 ]  #第二层for循环中添加的if判断语句,当$i=3是执行then内容then                break            #第二层for循环判断语句执行命令,break结束循环fi               #if语句结束echo "$i"            #第二层for循环语句执行每循环一次输出$idone                 #第二层for循环语句结束标志                
done                     #第一层for循环语句结束标志bash o.sh                #调用bash执行o.sh脚本
执行结果:第二层执行在$i=3是结束了循环,所以只能输出1和2,
第一层for循环是循环3次,所以输出了3次。
1
2
1
2
1
2

 

四.常用循环

4.1.循环打印九九乘法表

①第一步for循环打印一行9个*号

②第二步再添加一个for循环打印一个9行9列的*号正方形

②第三步将*号正方形斜砍一般形成9*9乘法表的基本格式

③第四步将*号9*9乘法表格式用乘法算式替换

第一步:
vim jj.sh              #创建jj.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9}        #for循环9次从i=1开始
do
echo -n "*"            #每循环一次打印一个*,echo  -n参数表示不换行
done                   #此for循环语句结束
bash  jj.sh            #调用shell执行脚本
执行结果:
*********第二步:
vim jj.sh              #编辑jj.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #添加打印列循环,循环9次从j=1开始  
do                     #j循环时做do中的内容    for i in {1..9}    #第一步for循环内容不变doecho -n "*"done
echo                   #列循环每循环一次打印一行空格进行换行
done                   #列循环for语句结束标志
bash  jj.sh            #调用shell执行脚本
执行结果:
*********
*********
*********
*********
*********
*********
*********
*********
*********第三步:
vim jj.sh              #编辑jj.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #列循环内容不变  
do                         for i in `seq $j`  #修改行循环i的取值范围为展开变量j,即当j=1时i取值只有1,所以循环一次。当 j=2时,i取值为1和2,所以i=1和i=2各循环一次,循环2次。以此类推到j=9doecho -n "*"done
echo                   
done                   
bash  jj.sh            #调用shell执行脚本
执行结果:
*
**
***
****
*****
******
*******
********
*********第四步:
vim jj.sh                           #编辑jj.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}                  #列循环内容不变  
dofor i in `seq $j`doecho -ne "$j*$i=$[ $j*$i ]\t"   #行输出内容修改为9*9算式和结果。$[ ]表示计算里面的正整数结果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键done
echo                   
done                   
bash  jj.sh                         #调用shell执行脚本
输出结果:
1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81

4.2.循环ping测试某个网段网络连通性

需求:测试用户输入的某个32位网段是否可以ping通,且若可以ping通将此ip输出到文件host.txt中。

①第一步读取用户输入的32位网段。

②使用for循环生成用户输入网段的所有ip。

③使用ping命令在循环中测试用户输入网段内所有ip,注意指定ping包个数和超时结束时间,否则一直ping。

④将循环检查网络连通性放入后台执行。

vim p.sh    #创建p.sh脚本
脚本内容:
#!/bin/bash
read -p "请输入需要测试的网段,格式为(192.168.47.):" ip #读取用户输入内容为变量ip
for i in {1..254}               #for循环254次,从i=1开始
do
{                               #将{}内容当成一个整体
ping -c2 -w2 $ip$i &>/dev/null  #指定ping包为2个超时结束时间为2秒且将产生的内容全部放入null垃圾桶中,&符号表示错误输出也放入null垃圾桶中if [ $? -eq 0 ]  #if条件判断如果上一个循环执行的命令是正确的则$?返回0,若等于0执行then的内容thenecho "$ip$i  is  online" #if条件成立执行打印echo $ip$i >> host.txt   #将if条件成立的ip追加到host.txt文件中elseecho "$ip$i  is  offline" #if添加判断不成立执行打印fi
}&                            #将循环成立的内容放入后台执行
done
wait                          #执行结束不等待直接退出

 

4.3.while死循环实现猜数字游戏

需求:生成随机1-100的价格给用户猜测直到猜对结束游戏,并统计用户猜对猜了几次。

①第一步生成一个随机1-100数字

②第二步使用while循环写一个死循环直到用户猜对才结束循环

③在执行循环的过程中统计循环执行次数并输出

vim e.sh         #创建脚本e.sh
脚本内容:
#!/bin/bash
num=`echo $[ RANDOM%100+1 ]`  #$[RANDOM]是一个0-32767的随机数,%100+1除100取余+1表示生成0-100随机数
time=0           #定义猜对次数变量time初始值为0
while true       #生成while死循环
do               #循环动作为do内的内容
let time++       #每循环一次time变量自加1
read -p "请输入您猜测的数字,范围(1-100):" user #读取用户输入的内容为变量userif [ $user -eq $num ]    #条件判断分支1,如果用户输入等于随机生成执行then动作then echo "您猜对了,您一共猜测了$time次"  #if分支1条件成立执行输出break                               #if分支1条件成立则结束本次循环elif [ $user -gt $num  ] #条件判断分支2,如果用户输入大于随机生成执行本次then动作thenecho "您猜大了,请往小猜"  #条件判断分支2成立提示用户猜大了elif [ $user -lt $num ]  #条件判断分支3,如果用户输入小于随机生成执行本次then动作then echo "您猜小了,请往大猜"  #条件判断分支3成立提示用户猜小了fi                       #if语句结束
donebash  e.sh                   #调用bash执行脚本
执行结果
请输入您猜测的数字范围(1-100):50
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):60
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):70
您猜大了,请往小猜
请输入您猜测的数字范围(1-100):65
您猜大了,请往小猜
请输入您猜测的数字范围(1-100):62
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):63
恭喜您猜对了,您一共猜了6次

4.4.数字累加脚本(1-100) 

需求:编写脚本实现计算从1加到100的值

①累加需要用到循环,已知循环次数时使用for循环

②也可以使用while循环达到累加条件时结束循环

vim m.sh                     #创建m.sh脚本
脚本内容:
sum=0                        #定义变量sum初始值为0
for i in {1..100}            #for循环 i取值从1到100
do 
sum=$[ i+sum ]               #每次循环内容计算变量i+sum的值赋值给sum
done                         #for语句结束标志
echo "1-100累加值为:$sum"    #循环结束后输出内容bash  m.sh                   #调用shell执行脚本
执行结果:
"1-100累加值为:5050"

 

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

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

相关文章

Linux的热拔插UDEV机制

文章目录 UDEV简介守护进程基本特点 守护进程和后台进程的区别开发守护进程结束 UDEV简介 udev是一个设备管理工具&#xff0c;udev以守护进程的形式运行&#xff0c;通过侦听内核发出来的uevent来管理/dev目录下的设备文件。 udev在用户空间运行&#xff0c;而不在内核空间 …

硬编码基础一(经典定长指令,寄存器相关)

硬编码基础一&#xff08;定长指令&#xff09; push/pop 通用寄存器 50~57是push8个32位通用寄存器 58~5f是pop8个32位通用寄存器 inc/dec 通用寄存器 40~47是inc8个32位通用寄存器 47~4f是dec8个32位通用寄存器 八位通用寄存器的立即数赋值 b0~b3 {立即数} 是低八位(…

【使用Zookeeper当作注册中心】自己定制负载均衡常见策略

自己定制负载均衡常见策略 一、前言随机&#xff08;Random&#xff09;策略的实现轮询&#xff08;Round Robin&#xff09;策略的实现哈希&#xff08;Hash&#xff09;策略 一、前言 大伙肯定知道&#xff0c;在分布式开发中&#xff0c;目前使用较多的注册中心有以下几个&…

Typescript基础知识(类型拓宽、类型缩小)

系列文章目录 引入一&#xff1a;Typescript基础引入&#xff08;基础类型、元组、枚举&#xff09; 引入二&#xff1a;Typescript面向对象引入&#xff08;接口、类、多态、重写、抽象类、访问修饰符&#xff09; 第一章&#xff1a;Typescript基础知识&#xff08;Typescri…

elementPlus——图标引入+批量注册全局组件——基础积累

因为我们要根据路由配置对应的图标&#xff0c;也要为了后续方便更改。因此我们将所有的图标注册为全局组件。&#xff08;使用之前将分页器以及矢量图注册全局组件的自定义插件&#xff09;&#xff08;所有图标全局注册的方法element-plus文档中已给出&#xff09; 全局注册…

Docker-compose详解和LNMP搭建实战

目录 一、Docker-compose简介 1.前言 2.概述 二、Docker-compose安装 安装源获取 安装包下载 三、YAML文件格式及编写注意事项 1.简介 2.使用方法 四、Docker Compose 常用命令 五、Docker Compose 配置常用字段 六、Docker-compose搭建LNMP实战 一、Docker-compose…

MySQL的安装以及卸载

下载官网 https://www.mysql.com/ 切到下载tab页 找到 MySQL Community Server 或者 MySQL Community (GPL) Downloads --> MySQL Community Server 点击download按钮&#xff1a; 点击download进入下载页面选择No thanks, just start my download就可以开始下载了。 下…

【ARM】Day5 uart总线, LED点亮实验(C语言实现)

1. 思维导图 2. LED点灯实验&#xff08;C语言实现&#xff09; gpio.h #ifndef _LED_H__ //防止头文件重复包含_ #define _LED_H__//RCC_MP_AHB4ENSETR寄存器封装 #define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)//GPIO使用封装结构体 typedef struct{v…

【Linux】进程优先级

一、基本概念 Hello&#xff0c;大家好。本文我们要来介绍的是有关Linux下【进程优先级】&#xff0c;首先我们要了解的是其基本概念 在 Linux基础篇之权限 一文中我们有谈到过什么是权限&#xff0c;在Linux下有权限和无权限的区别在哪里。那现在的话我们就要来对比一下【权限…

js 的正则表达式(二)

1.正则表达式分类&#xff1a; 正则表达式分为普通字符和元字符。 普通字符&#xff1a; 仅能够描述它们本身&#xff0c;这些字符称作普通字符&#xff0c;例如所有的字母和数字。也就是说普通字符只能够匹配字符串中与它们相同的字符。 元字符&#xff1a; 是一些具有特殊含…

一文科普,配资门户网是什么?

配资门户网是一个为投资者提供配资服务的平台。配资是指通过借用他人资金进行投资交易的一种金融操作方式。配资门户网作为一个线上平台&#xff0c;为投资者提供了方便、快捷的配资服务。 配资门户网提供了多种不同的配资方案&#xff0c;以满足不同投资者的需求。投资者可以…

通过Git使用GitHub

目录 一、建立个人仓库 二、配置SSH密钥 三、克隆仓库代码 四、推送代码到个人仓库 五、代码拉取 一、建立个人仓库 1.建立GitHub个人仓库&#xff0c;首先注册GitHub用户。注册好了之后&#xff0c;打开用户的界面 然后就是配置问题 配置好后拉到最下方点击create repos…

opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例

支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种二分类模型&#xff0c;目标是寻找一个标准&#xff08;称为超平面&#xff09;对样本数据进行分割&#xff0c;分割的原则是确保分类最优化&#xff08;类别之间的间隔最大&#xff09;。当数据…

next.js 创建 react ant design ts 项目

环境说明&#xff1a;next.js 官方文档要求node版本在16.8以上。笔者使用的 node版本是16.20.1&#xff0c;不要使用16.13.0&#xff0c;笔者在使用 node16.13.0环境时创建的 react 项目点击事件无效 next.js官网截图 next.js 官网&#xff1a;https://nextjs.org/ react 官网…

【UniApp开发小程序】商品详情展示+评论、评论展示、评论点赞+商品收藏【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面日期格式化 后端收藏ControllerServicemapper 评论ControllerServiceMapper 商品Controller 阅读Service 界面效果 【说明】 界面中商品的图片来源于闲鱼&#xff0c;若侵权请联系删除 【商品详情】 【评论】 界面实现 工具js 该工…

uniapp 微信小程序 绘制海报,长按图片分享,保存海报

uView UI 2.0 dcloud 插件市场地址 弹窗海报源码 <template><!-- 推荐商品弹窗 --><u-popup :show"haibaoShow" mode"center" round26rpx z-index10076 bgColortransparent safeAreaInsetTop close"goodsclose"><image …

WPF入门到精通:1.新建项目及项目结构

WPF&#xff08;Windows Presentation Foundation&#xff09;是一种用于创建 Windows 应用程序的技术&#xff0c;它可以通过 XAML&#xff08;Extensible Application Markup Language&#xff09;和 C# 或其他 .NET 语言来实现。WPF 提供了许多强大的 UI 控件和样式&#xf…

Azure虚拟网络对等互连

什么是Azure虚拟网络对等互联 Azure虚拟网络对等互联&#xff08;Azure Virtual Network peering&#xff09;是一种连接两个虚拟网络的方法&#xff0c;使得这两个虚拟网络能够在同一地理区域内进行通信。它通过私有IP地址在虚拟网络之间建立网络连接&#xff0c;不论是在同一…

星际争霸之小霸王之小蜜蜂(四)--事件监听-让小蜜蜂动起来

目录 前言 一、监听按键并作出判断 二、持续移动 三、左右移动 总结&#xff1a; 前言 今天开始正式操控我们的小蜜蜂了&#xff0c;之前学java的时候是有一个函数监听鼠标和键盘的操作&#xff0c;我们通过传过来不同的值进行判断&#xff0c;现在来看看python是否一样的实现…

SpringMVC之异常处理

SpringMVC之异常处理 异常分为编译时异常和运行时异常&#xff0c;编译时异常我们trycatch捕获&#xff0c;捕获后自行处理&#xff0c;而运行时异常是不可预期的&#xff0c;就需要规范编码来避免&#xff0c;在SpringMVC中&#xff0c;不管是编译异常还是运行时异常&#xff…