shell脚本—循环语句

文章目录

  • 循环语句
    • 循环含义
    • 1、for
    • 2、while
      • while循环
    • 3、until
    • 4、双重循环及跳出循环

循环语句

echo命令:标准输出或提取shell变量的值

  • 标准输出
[root@localhost ~]#echo 123456|passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
  • 提取shell变量的值
echo -n   表示不换行输出
echo -e   表示输出转义符

常用转义符

转义符说明
\b表示退格,不显示前一个字符
\c抑制更多的输出或不换行
\f换行,但光标仍停留在原处
\n换行
\r回车
\t横向制表符
\v纵向制表符
\\反斜杠
[root@localhost data]#echo -e "1234\b567"
123567
[root@localhost data]#echo -e "1234\b\b567"
12567
[root@localhost data]#echo -e "1234\b\b\b567"
1567
[root@localhost data]#echo -e "1234567\c"
1234567[root@localhost data]#
[root@localhost data]#echo -e "123\c4567"
123[root@localhost data]#

image-20240125135525354

date

  • date查看当前系统时间
选项说明
-d描述的日期,显示指定字符串所描述的时间,而非当前时间
%F完整日期格式,等价于 %Y-%m-%d
%T时间(24小时制)(hh:mm:ss)
[root@localhost data]#date
2024年 01月 25日 星期四 14:02:14 CST
[root@localhost data]#date -d '-1 day' +%F
2024-01-24
[root@localhost data]#date -d '1 day' +%F
2024-01-26
[root@localhost data]#date +%F
2024-01-25
##%F 与 %T之间要用分隔符隔开
[root@localhost data]#date -d '1 day' +%F-%T
2024-01-26-14:03:52
[root@localhost data]#date -d '1 day' +%F'  '%T
2024-01-26  14:04:38##查看日历
[root@localhost data]#cal 11 2000十一月 2000
日 一 二 三 四 五 六1  2  3  45  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30crontab里不能有"%"号,要用转义符"\"
30 2 * * * /bin/cp -a /etc/ /data/etc`date +\%F_\%T`
30 2 * * * /bin/cp -a /etc/ /data/etc`date +‘%F_%T’` 

image-20240125141541714

seq

  • 打印列表
#从1开始,10停止,间隔为2打印(显示1到10的奇数)
[root@localhost data]#seq 1 2 10
1
3
5
7
9
#从1开始,10停止打印(显示1到10的数)
[root@localhost data]#seq 1 10
1
2
3
4
5
6
7
8
9
10
#从0开始,10停止,间隔为2打印(显示0到10的偶数)
[root@localhost data]#seq 0 2 10
0
2
4
6
8
10

image-20240125142348670

循环含义

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

重复运行次数

  • 循环次数事先已知
  • 循环次数事先未知

常见的循环的命令:for, while, until

for:一般用于已知次数(事先已知)

while,和until:一般用于已知条件(事先未知)

1、for

语法结构

  • 列表循环
  • 不带列表循环
  • 类C风格的for循环

语法格式

for 变量名 in   {list}
do命令序列
done
##1到100的求和
[root@localhost data]#vim ww.sh
#!/bin/bash
#1到100的求和
sum=0
for i in {1..100}
do
sum=$[i+sum]
done
echo "求和结果是$sum"#1到100的奇数求和
sum=0
for i in {1..100..2}
do
let sum+=$i
done
echo "奇数和为$sum"#1到100的偶数求和
sum=0
for i in {0..100..2}
do
let sum+=$i
done
echo "偶数和结果为$sum"[root@localhost data]#bash ww.sh
求和结果是5050
奇数和为2500
偶数和结果为2550

image-20240125160533188

##批量添加用户,用户名存放在name.txt文件中,一行放一个用户名,初始密码均设为123456
[root@localhost data]#vim name.txt
qiyi
qier
qisan
qisi
qiwu
qiliu
qiqi[root@localhost data]#vim .qwe.sh
#!/bin/bash
for i in `cat /data/name.txt`
do
useradd $i
echo 123456|passwd --stdin $i
done[root@localhost data]#bash .qwe.sh
useradd:用户“qiyi”已存在
更改用户 qiyi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qier”已存在
更改用户 qier 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qisan”已存在
更改用户 qisan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qisi”已存在
更改用户 qisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qiwu”已存在
更改用户 qiwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qiliu”已存在
更改用户 qiliu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qiqi”已存在
更改用户 qiqi 的密码 。
passwd:所有的身份验证令牌已经成功更新。

image-20240125162425413

image-20240125170410723

##ping192.168.10.0/24网段
[root@localhost data]#vim xx.sh
#!/bin/bash
for i in {1..254}
do
{
ping -c2 -w2 192.168.10.$i &>/dev/null && echo "$i is online" >> /data/hostonline.txt  || echo "$i is offline" >> /data/hostoffline.txt
} &
done[root@localhost data]#ls
hostoffline.txt  hostonline.txt
[root@localhost data]#cat hostonline.txt
1 is online
2 is online
11 is online
1 is online
11 is online
2 is online
[root@localhost data]#cat hostoffline.txt
10 is offline
5 is offline
8 is offline
3 is offline
13 is offline
12 is offline
15 is offline
16 is offline
17 is offline
20 is offline
21 is offline
23 is offline
26 is offline
27 is offline
……

image-20240125181555829

2、while

相对于for,需要知道循环次数,当我们只知道停止条件,不知道次数,就需要使用while,直到达到条件

while循环

while循环一般用于有条件判断的循环,若判断条件成立,则进入循环,当条件不成立就跳出循环

  • 语法结构
while 条件判断
do命令序列
done
  • 死循环

    while写一个永远为真 的条件

    while true

    while :

##1到100的求和
[root@localhost data]#vim yu.sh
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
sum=$[i+sum]
let i++
#跳出条件(执行一次循环,i自动加1)
done
echo $sum[root@localhost data]#bash yu.sh
5050

image-20240125171424259

##新建用户以stu开头,按数字排序1到20.初始密码是123456
[root@localhost data]#vim add.sh
#!/bin/bash
a=1
while [ $a -le 20 ]
do
useradd stu$a
echo 123123|passwd --stdin stu$a  &>/dev/null
let a++
done[root@localhost data]#bash add.sh
[root@localhost data]#tail -f /etc/passwd
stu11:x:1019:1019::/home/stu11:/bin/bash
stu12:x:1020:1020::/home/stu12:/bin/bash
stu13:x:1021:1021::/home/stu13:/bin/bash
stu14:x:1022:1022::/home/stu14:/bin/bash
stu15:x:1023:1023::/home/stu15:/bin/bash
stu16:x:1024:1024::/home/stu16:/bin/bash
stu17:x:1025:1025::/home/stu17:/bin/bash
stu18:x:1026:1026::/home/stu18:/bin/bash
stu19:x:1027:1027::/home/stu19:/bin/bash
stu20:x:1028:1028::/home/stu20:/bin/bash

image-20240125183534562

##猜商品价格,通过变量RANDOM获得随机数,提示用户猜测并记录次数,猜中后退出
[root@localhost data]#vim qi.sh
#!/bin/bash
a=`echo $[RANDOM%1000+1]`
time=0
while :
do
read -p "请输入商品的价格(1-1000):" h
let time++
#统计猜测的次数
if [ $a -eq $h ];then
echo "恭喜你,猜中了,商品价格是${h};你一共猜了${time}次"
exit
#跳出循环
elif [ $a -gt $h -a $h -le 1000 -a $h -gt 0 ];then
echo "你猜的价格过低"
elif [ $a -lt $h -a $h -le 1000 ];then
echo "你猜的价格过高"
else
echo "输入有误,请重新输入"
fi
done[root@localhost data]#bash qi.sh
请输入商品的价格(1-1000):100
你猜的价格过低
请输入商品的价格(1-1000):1000
你猜的价格过高
请输入商品的价格(1-1000):45620
输入有误,请重新输入
请输入商品的价格(1-1000):450
你猜的价格过高
请输入商品的价格(1-1000):1\186
输入有误,请重新输入
请输入商品的价格(1-1000):186
你猜的价格过低
请输入商品的价格(1-1000):270
恭喜你,猜中了,商品价格是270;你一共猜了7次

image-20240125191322887

3、until

until 循环与 while 循环类似,while 循环能实现的脚本 until 同样也可以实现,但区别是while 循环在条件为真是继续执行循环,而 until 则是在条件为假时执行循环

until 循环语句的语法结构如下所示。

until 条件测试操作
do命令序列
done
##1到100的求和
[root@localhost data]#vim zx.sh
#!/bin/bash
sum=0
i=0
until [ $i -gt 100 ]
do
let sum=$i+$sum
let i++
done
echo sum=$sum[root@localhost data]#bash zx.sh
sum=5050

image-20240125203404908

4、双重循环及跳出循环

  • break跳出单个循环 break n 数字(数字是几,代表跳出n层循环)
  • continue终止某次循环中的命令,但是不会完全终止命令
  • exit 直接退出脚本

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

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

相关文章

SWMM模型INP解析

.INP文件解析 [OPTIONS]:SWMM软件运行前需要设置的参数 [RAINGAGES]雨水节点,核心设置雨水时间序列,可为INP内部数据也可为外部txt数据,TIMESERIES对应【TIMESERIES】模块,TS_1为时间序列名称 [TIMESERIES]&#xff0…

部署幻兽帕鲁联机服务器需要怎样配置的云服务器?

随着互联网技术的快速发展,多人在线游戏逐渐成为人们休闲娱乐的重要方式。作为一款备受欢迎的游戏,幻兽帕鲁以其独特的玩法吸引了大量玩家。为了获得更好的游戏体验,许多玩家选择在云服务器上自行部署幻兽帕鲁联机服务器。本文将详细介绍部署…

设置模式之责任链模式

目录 1.概述 2.结构 3.实现 4.总结 1.概述 责任链模式(Chain of Responsibility Pattern)是一种行为性设计模式;它为请求创建了一个接收者对象的链,允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均…

图像处理python基础

array 读取图片 tensor 模型预测 一般过程:读取数据np->tensor->model->result->np->画图 shape确保图像输入输出尺寸正确 读取图片 将在GPU上运行的tensor类型转变成在CPU上运行的np类型 三类计算机视觉任务的输入: 分类&#xff1…

【软考问题】-- 1 - 知识精讲 - 项目管理理论

一、基本问题 1:项目的特点是什么? 临时性:是指项目有明确的起点和终点,从项目启动到项目收尾。项目目标实现后,项目收尾工作完成即标志着项目结束。独特性:项目是独特的,之前没有做过的&#x…

JS高频面试题(上)

1. 介绍JS有哪些内置对象? 数据封装类对象:Object、Array、Boolean、Number、String 其他对象:Function、Arguments、Math、Date、RegExp、Error ES6新增对象:Symbol(标识唯一性的ID)、Map、Set、Promise…

Python + Selenium —— 网页元素定位之CSS 选择器!

CSS(Cascading Style Sheets)是一种语言,用来描述HTML和XML文档的样式。 CSS 选择器用来定位 HTML 上的元素,然后对其进行渲染。通过 CSS 选择器可以定位到页面上的任意元素。这些选择器可以被 WebDriver 用作另外的定位策略。 CSS 可以较为灵活的选择控…

蓝桥杯准备之路-Java基础复习

一、基本数据类型 int(32),long(64),float,double,boolean ,char 溢出判断: System.out.println("蓝桥杯练习第一天");Scanner scan new Scanner(System.in);int a scan.nextInt();System.out.println(a);int a1 Integer.MAX_VALUE;System.out.prin…

Linux管道学习(无名管道)

目录 1、概述 2、管道的创建 3、管道读写行为 3.1、管道读 在linux中管道有两种,一是无名管道(匿名管道),第二种是有名管道;无名管道主要用于有血缘关系的父子进程间通信,有名管道则不受该限制&#xf…

字符串匹配(BF KMP)详解 + 刷题

目录 🌼前言 BF 算法 KMP 算法 (1)前缀函数 -- O(n^3) (2)前缀函数 -- O(n^2) (3)前缀函数 -- O(n) (4)辅助理解 🐋P1308 -- 统计单词数 …

文件包含技术总结

开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。 allow_url_fopen On(是否允许打开远程文件) allow_url_include On&…

机器学习算法(一)

一、线性回归 线性回归(Linear Regression)可能是最流行的机器学习算法。线性回归就是要找一条直线,并且让这条直线尽可能地拟合散点图中的数据点。它试图通过将直线方程与该数据拟合来表示自变量(x 值)和数值结果&am…

uniapp page宽度设置为750rpx,子元素宽度100%,大小不一致

uniapp page宽度设置为750rpx,子元素宽度100%,大小不一致。 原因是我在page加了margin: 0 auto;去掉就正常了(但是如果在超大屏幕还是会出现,我猜是使用rpx导致的,rpx渲染成页面时会转成精确到一个小数点几位数的rem&a…

[实战]加密传输数据解密

前言 下面将分享一些实际的渗透测试经验,帮助你应对在测试中遇到的数据包内容加密的情况。我们将以实战为主,技巧为辅,进入逆向的大门。 技巧 开局先讲一下技巧,掌握好了技巧,方便逆向的时候可以更加快速的找到关键函数…

arcgis实现截图/截屏功能

arcgis实现截图/截屏功能 文章目录 arcgis实现截图/截屏功能前言效果展示相关代码 前言 本篇将使用arcgis实现截图/截屏功能&#xff0c;类似于qq截图 效果展示 相关代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta nam…

突发:Do Kwon申请破产!

作者&#xff1a;秦晋 1月22日&#xff0c;据《彭博社》报道&#xff0c; 由Do Kwon联合创立的Terraform Labs Pte.数字资产公司在美国特拉华州申请破产保护。 根据周日在特拉华州提交的法庭文件显示&#xff0c;该公司的资产和负债估计均在1亿至5亿美元之间&#xff0c;债权人…

【Linux编译器-gcc/g++使用】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 设计样例&#xff0c;先见一下 方案一&#xff1a; 方案二&#xff1a; 在企业里面一般维护软件的源代码的话&#xff0c;要维护几份&#xff1f; 方案一&…

mysql数据库事务(事务设置、隔离级别、实现原理)

目录 事务 数据库事务 事务特性 事务设置 事务隔离级别 1.读未提交 2.读已提交 3.可重复读 4.串行化 事务实现原理 原子性&#xff1a;undolog 持久性&#xff1a;redolog 隔离性: 如果隔离级别是读已提交&#xff1a; 如果隔离级别是可重复读&#xff1a; 事务…

【Linux】 开始使用 gcc 吧!!!

Linux 1 认识gcc2 背景知识3 gcc 怎样完成 &#xff1f;3.1 预处理预处理^条件编译 3.2 编译3.3 汇编3.4 链接 4 函数库5 gcc 基本选项Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 1 认识gcc 我们在windows环…

系统架构设计师教程(十六)嵌入式系统架构设计理论与实践

嵌入式系统架构设计理论与实践 16.1 嵌入式系统概述16.1.1 嵌入式系统发展历程16.1.2 嵌人式系统硬件体系结构16.2 嵌入式系统软件架构原理与特征16.2.1 两种典型的嵌入式系统架构模式16.2.2 嵌入式操作系统16.2.3 嵌入式数据库16.2.4 嵌入式中间件16.2.5 嵌入式系统软件开发环…