Shell脚本——循环语句(for、while和until循环)

一、命令

1.echo命令

echo -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上

常见转义字符:

\b 相当于退格键

转义后相当于退格键(backspace),但是前提是“\b”存在字符。“\b”表示删除前一个字符,“\b\b”表示删除前面两个字符。

\t 制表符显示

转义后表示插入横向制表符,即tab。

\c 不换行输出

不换行输出,在“\c”后面不存在字符的情况下,作用相当于echo -n,但是当“\b”后面仍然存在字符时,“\c”后面的字符将不会被输出。

\n 换行输出

换行输出,被输出的字符从"\n"处开始另起一行

实验:

目的 写入脚本磁盘自动分区

echo "- - -" > /sys/class/scsi_host/host0/scan;echo "- - -" > /sys/class/scsi_host/host1/scan;echo "- - -" > /sys/class/scsi_host/host2/scan

刷新新加磁盘

去编辑脚本:

#!/bin/bash
#自动分区磁盘
read -p "请输入需要分区的设备(例如/dev/sdb):" disk
echo -e "n\n\n\n\n+5G\nw\n"|fdisk $disk

再去查看下:

2.date   查看当前系统时间

-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间

%F 完整日期格式,等价于 %Y-%m-%d

% T 时间(24小时制)(hh:mm:ss)

3. seq

循环语句

循环:将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件

重复运行次数

  • 循环次数事先已知

  • 循环次数事先未知

常见的循环的命令:for(已知次数)  ,while(已知条件), until(已知条件)

二、for循环

(一)for 循环实验及介绍

for 用于已知循环次数的场景

格式:

for   变量名称      in   取值列表
do   

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

done    循环结束标志

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

哈哈,网速不好,没加载好

实验1:批量修改文件后缀名             sh改名txt 

#!/bin/bash
for i in `ls /data`
do
name=`echo ${i} | cut -d"." -f1`
mv /data/${i}      /data/${name}.txt
done

把data下的所有文件,改成已.txt 结尾的(最好切换到别的目录,例如opt ,要不会到data下的文件都变成txt)

实验2:用脚本求1到100的和

#!/bin/bash
sum=0
for i in {1..100}
do
sum=$[i+sum]
done

echo "100以内的求和结果:$sum"
#i=1 sum =0 sum1=1+0
#i=2 sum =1 sum2=1+2
#i=3 sum =3 sum3=3+3

实验3:求1到100奇数和                    求1到100奇数和

(面试题哈这是)

#!/bin/bash
#求1到100的和
sum=0
for i in {1..100}
do
sum=$[i+sum]
done

echo "100以内的求和结果:$sum"
#i=1 sum =0 sum1=1+0
#i=2 sum =1 sum2=1+2
#i=3 sum =3 sum3=3+3

echo -e "-----------------------------------------------"
#求1到100奇数和
sum=0
for i in {1..100..2}
do
let sum+=$i
done
echo "100以内的奇数和:$sum"

echo -e "-----------------------------------------------"
#求1到100偶数和
sum=0
for i in {0..100..2}
do
let sum=$[i+sum]
done
echo "100以内的偶数和:$sum"

实验4:用 for 写一个a.sh循环脚本

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

实验5:批量添加用户

实验目的:

#!/bin/bash
for i in `cat /data/name.txt`
do
id $i   &>/dev/null
  if [ $? -eq 0 ]; then
  echo "${i}用户以存在"
  else

useradd $i
echo 123456 |passwd --stdin $i  &>/dev/null
  fi
done

看下 /etc/passwd 是否存在,在文章末尾,也可以cat /etc/passwd |tail看

因为刚才已经创建了 name.txt 里面的用户,所以无法再次创建

实验6:ping一整个网段(192.168.246段为例)

方法一:

#!/bin/bash
for i in  {1..254}
do
{
ping  -c2  -W2  192.168.246.$i &>/dev/null && echo "$i  is online" >> /data/hostonline.txt || echo "$i is  offlin
e"  >>  /data/hostoffline.txt
} &
done

方法二:

#!/bin/bash
{
for i in {1..254}
do
ping -c2 -W2 192.168.246.$i    &>/dev/null
 if [ $? -eq 0 ] ;then
 echo "host is online" >> /data/on.txt
 else
 echo "host is offline">> /data/off.txt
 fi
done
} &

(二)类似于C语言风格的for循环

for ((expr1;expr2;expr3))
do
       command
done

expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出


sum+=i    等于   sum=sum+i  
#需要使用 let  命令

++	自身变量+1
--  自身变量-1
+=5	自身变量+5
-=5	自身变量-5
*=5	自身变量*5
/=5	自身变量/5
%=5	自身变量%5

用脚本求1到100的和

#!/bin/bash
sum=0
for ((i=0;i<=100;i++))
do
sum=$[sum+i]
done
echo "输出1到100的和: $sum"

(三)小实验:循环打印9*9乘法表

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

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

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

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

9*9乘法表
第一步:
vim 99.sh              #创建99.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9}        #for循环9次从i=1开始
do
echo -n "*"            #每循环一次打印一个*,echo  -n参数表示不换行
done                   #此for循环语句结束
bash  99.sh            #调用shell执行脚本
执行结果:
*********
第二步:
vim 99.sh              #编辑99.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #添加打印列循环,循环9次从j=1开始  
do                     #j循环时做do中的内容    
    for i in {1..9}    #第一步for循环内容不变
    do
    echo -n "*"
    done
echo                   #列循环每循环一次打印一行空格进行换行
done                   #列循环for语句结束标志
bash  99.sh            #调用shell执行脚本
执行结果:
*********
*********
*********
*********
*********
*********
*********
*********
*********
第三步:
vim 99.sh              #编辑99.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=9
    do
    echo -n "*"
    done
echo                   
done                   
bash  99.sh            #调用shell执行脚本
执行结果:
*
**
***
****
*****
******
*******
********
*********
第四步:
vim 99.sh              #编辑99.sh脚本
脚本内容:
#!/bin/bash
for  j  in  {1..9}     #列循环内容不变  
do
    for i in `seq $j`
    do
    echo -ne "$j*$i=$[ $j*$i ]\t"   #行输出内容修改为9*9算式和结果。$[ ]表示计算里面的正整数结 
                              果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键
    done
echo                   
done                   
bash  99.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

          9*9乘法表 倒打印

一个正着打印,一个倒打印

#!/bin/bash
for j in {1..9}
do
for i in `seq $[10-$j]`
do
echo -ne " ${i}x`echo $[10-j]`=$[(10 -j)*i]\t"
done
echo
done

echo -e "------------------------------------------"

#!/bin/bash
for j in {9..1..-1}
do
for i in `seq $[10-$j]`
do
echo -ne " ${i}x`echo $[10-j]`=$[(10 -j)*i]\t"
done
echo
done

三、 while 

while 条件语句用于重复测试某个条件,当条件成立时则继续重复执行

我们只知道停止条件,不知道次数,就需要使用while直到达到条件

while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环

while循环可以不断的执行某个程序,直到用户设置的条件完成为止,所以重点是条件,这种不定循环最常见的就是下面这两种格式了。
1.格式:
while循环:while的中文是【当…时】,所以这种方式说的是,当判断式/命令序列的条件成立时,就进行循环,直到命令序列/程序段落的条件不成立才停止。

语法结构:

while   判断条件
do
命令1
done 




#语法与if相似 

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

do       

执行动作     while循环执行动作

done           while循环结束标志

1.死循环

在Shell脚本中,while 死循环是指一个 while 循环结构,其条件始终为真,导致循环体内的命令会无限重复执行,除非外部干预

(如通过 Ctrl+C 终止程序或在循环体内使用 break、exit等语句跳出循环)

死循环有三种如下:

1 while   条件永远为真
2 while  :                        表示为空,永远为真
3 while  true

2.实验   while 求1到100的和

#!/bin/bash

i=0
sum=0
while [  $i -le 100 ]
do

sum=$[i+sum]

let i++

done

echo "1到100的和为$sum"

3.实验    批量添加用户

4.实验    批量删除用户

#!/bin/bash

u=1
while [ $u -le 20 ]
do
userdel -r stu$u
let u++
done

5.实验  猜商品的价格游戏

脚本中的$RANDOM 是一个随机变量

#!/bin/bash

p=`echo $[RANDOM%1000+1]`
time=0


while :
do
read -p "请输入商品的价格(1-1000):" h
let  time++
if [ $p -eq $h ]
then
echo "恭喜您猜中了,商品的价格是${h};您一共猜了${time}次"
exit
elif [ $p -gt $h -a $h -le 1000 -a $h -gt 0 ]
then
echo "您猜的价格过低"
elif [ $p -lt $h -a $h -le 1000 ]
then
echo "您猜的价格过高"
else
echo "输入有误,请重新输入"
fi
done

四、until语句

见后续    

五.continue 和 break 和 exit

  • break跳出单个循环 break n 数字数字是几代表跳出n层循环

  • continue终止某次循环中的命令,但是不会完全终止命令

  • exit 直接退出脚本

见后续

点菜实验  ,鸡兔同笼 实验

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

按条件自动搜索文件

在计算机的某个文件夹中&#xff0c;假如有一大堆不同格式的文件&#xff0c;如下图&#xff1a; 我们的目的&#xff1a;快速查找出文件名中包含某文字内容的指定格式的文件&#xff0c;看看它们都放在哪里&#xff1f;通过分析&#xff0c;可能在当前文件夹中也可能在某个子…

LabVIEW探测器CAN总线系统

介绍了一个基于FPGA和LabVIEW的CAN总线通信系统&#xff0c;该系统专为与各单机进行系统联调测试而设计。通过设计FPGA的CAN总线功能模块和USB功能模块&#xff0c;以及利用LabVIEW开发的上位机程序&#xff0c;系统成功实现了CAN总线信息的收发、存储、解析及显示功能。测试结…

FinBert模型:金融领域的预训练模型

文章目录 模型及预训练方式模型结构训练语料预训练方式 下游任务实验结果实验一&#xff1a;金融短讯类型分类实验任务数据集实验结果 实验二&#xff1a;金融短讯行业分类实验任务数据集实验结果 实验三&#xff1a;金融情绪分类实验任务数据集实验结果 实验四&#xff1a;金融…

RT-Thread: STM32 SPI使用流程

1.添加驱动 ①点开设置界面 ②勾选看门 SPI 驱动 ③点击保存 ④查看添加的驱动文件 drv_spi.c 2.打开驱动头文件定义 ①打开配置文件 ②打开定义 3.打开需要开启的SPI总线 打开 drivers 目录下的 board.h 用SPI搜索&#xff0c;找到如下文字&#xff0c;打开对应的宏。 /*-…

非官方 Bevy 作弊书07-09

源自 网页 Working with 2D - Unofficial Bevy Cheat Book 个人用 有道 翻译&#xff0c;希望能够帮助像我一样的 英语不好 的 bevy 初学者 非官方 Bevy 作弊书 7 使用 bevy 2D 本章涵盖与使用 Bevy 制作 2D 游戏相关的主题。 2D Camera Setup - Unofficial Bevy Cheat Book 非…

架构篇26:高可用存储架构-集群和分区

文章目录 数据集群数据分区小结上一篇我们讨论了高可用存储架构中常见的双机架构,分别为主备复制、主从复制、双机切换和主主复制,并分析了每类架构的优缺点以及适应场景。 今天我们一起来看看另外两种常见的高可用存储架构:数据集群和数据分区。 数据集群 主备、主从、主…

金额格式化,三位数逗号分隔 vue2(借鉴)

在main.js全局注册 import Vue from vue;Vue.filter(currencyFormat, function(value) {if (!isNaN(parseFloat(value))) { // 判断输入值是否为有效数字value parseFloat(value);const parts value.toFixed(2).split(.); // 将小数点后两位转换为字符串并按小数点切割parts…

什么是servlet

什么是servlet 什么是servlet Servlet&#xff08;Server Applet&#xff09;是 Java Servlet 的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;用 Java 编写的服务器端程序&#xff0c;具有独立于平台和协议的特性&#xff0c;主要功能在于交互式地浏览和生成数据…

如何使用Flutter构建高质量的用户界面

Flutter 是一种比较流行的移动应用开发框架&#xff0c;可以让开发者使用一个代码库构建高质量的 iOS 和 Android 应用。Flutter 以其快速、美观、高度可定制等优点吸引了开发社区的广泛关注。但如何使用 Flutter 构建高质量的用户界面呢&#xff1f;下面分为以下几个部分简单的…

安全防御第三次作业

作业&#xff1a;拓扑图及要求如下图 注&#xff1a;server1是ftp服务器&#xff0c;server2是http服务器 lsw1&#xff1a; 其中g0/0/0口为trunk 实现 1&#xff0c;生产区在工作时间内可以访问服务器区&#xff0c;仅可以访问http服务器 验证&#xff1a; 2&#xff0c;办公…

使用python写一个比Windows系统自带浏览器更好用的计算器

【介绍】 比Windows系统自带的还好用的计算器&#xff0c;感兴趣的可以试用一下。 1.支持括号优先级运算和平方、立方计算&#xff1b; 2.支持计算历史记录功能&#xff1b; 3.支持界面缩放和拖动&#xff1b; 4.支持钉在界面&#xff08;界面最前置顶&#xff09;&#xff0c…

Higress 开源一周年:新版本,新标准,新工具,新征程

作者&#xff1a;Higress 团队 历程回顾 Higress 开源一年时间&#xff0c;一共发布了 18 个 release 版本&#xff0c;收获了 40 多位社区贡献者和 1800 star&#xff0c;上图是这一年过来达成的一些关键的里程碑。 前面半年通过集成开源生态&#xff0c;打磨开源版本稳定性…

【技术分享】Ubuntu 20.04如何更改用户名

产品简介 本文适用于所有RK3568/RK3588平台产品在Ubuntu 20.04系统上如何更改用户名&#xff0c;本文以IDO-EVB3588开发板为例&#xff0c;在ubuntu20.04系统上修改用户名industio为usernew。 IDO-EVB3588开发板是一款基于RK3588平台的产品。该开发板集成了四核Cortex-A76和四…

使用自有数据集微调ChatGLM2-6B

1 ChatGLM2-6B介绍 ChatGLM是清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人。ChatGLM基于GLM130B千亿基础模型训练&#xff0c;它具备多领域知识、代码能力、常识推理及运用能力&#xff1b;支持与用户通过自然语言对话进行交互&#xff0c;处理多种自然语言任…

线性代数基础【6】二次型

第一节、二次型的基本概念及其标准型 一、基本概念 ①二次型 含n个变量x1,x2,…,xn,且每项都是2次的齐次多项式 ②标准二次型 只含有平方项不含交叉项的二次型称为标准二次型 ③二次型的标准化 设f(X)X^TAX 为一个二次型,经过可逆的线性变换XPY(即P为可逆矩阵)把二次型…

简述云原生基础定义及关键技术

云原生是什么 云原生是面向“云”而设计的应用,因此技术部分依赖于传统云计算的 3 层概念,基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。 例如,敏捷的不可变基础设施交付类似于 IaaS,用来提供计算网络存储等基础资源,这些资源是可编程且不可变的,直…

Web后端开发-原理篇(1)

hello啊各位&#xff0c;我们前期一直在讲解web后端开发都是面向应用层面的&#xff0c;而我们今天讲解的是Web后端开发的最后一个篇章——springboot原理篇&#xff0c;即springboot的原理。 那我们今天讲解的内容包括三个部分&#xff0c;分别是配置优先级、Bean管理、Sprin…

[Python] 机器学习 - 常用数据集(Dataset)之鸢尾花(Iris)数据集介绍,数据可视化和使用案例

鸢(yuān)尾花(Iris)数据集介绍 鸢【音&#xff1a;yuān】尾花&#xff08;Iris&#xff09;是单子叶百合目花卉&#xff0c;是一种比较常见的花&#xff0c;而且鸢尾花的品种较多&#xff0c;在某个公园里你可能不经意间就能碰见它。 鸢尾花数据集最初由Edgar Anderson 测量…

Linux第1课 Linux系统简介

1.操作系统介绍 操作系统&#xff08;Operating System, OS &#xff09;是一组主管并控制计算机操作、运用和运行硬件、软 件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。它是硬件基础上的第一 层软件&#xff0c;是硬件和其它软件沟通的桥梁&#xff08;或者…

mapstruct自定义转换,怎样将String转化为List

源码&#xff1a;https://gitee.com/cao_wen_bin/test 最近在公司遇到了这样一个为题&#xff0c;前端传过来的是一个List<Manager>,往数据库中保存到时候是String&#xff0c;这个String使用谷歌的json转化器。 当查询的时候在将这个数据库中String的数据以List<Mana…