shell的for循环与结构化

news2024/11/19 11:24:14

shell笔记

      • 列表for循环
      • 不带列表for循环
      • for循环举例
        • 1.例1 所有文件名大写替换为小写
        • 2. 例2 读取/etc/passwd文件,依次输出ip段
        • 3. 例3 读取/etc/hosts内容for循环,执行ping
        • 4. 例4 循环ip列表,输出对应编号
        • 5. 例5 批量添加用户
      • break
        • 1. 例1 break
      • continue
        • 1. 例1 continue

列表for循环

  1. 列表for循环的语法结构如下:
for variablein list	#每一次循环,依次把列表list 中的一个值赋给循环变量
do					#循环体开始的标志
	commands		#循环变量每取一次值,循环体就执行一遍commands
done				#循环结束的标志,返回循环顶部

列表 list 可以是命令替换、变量名替换、字符串和文件名列表(可包含通配符),每列表项以空格间隔。
for 循环执行的次数取决于列表 list 中单词的个数,可以省略in list,省略时相当于in"$@"。

  1. 例1:
#!/bin/bash
##filename:for1.sh
for x in centos ubuntu windows max
do
	echo "$x"
done

将字符串列表作为list,list包含centos ubuntu windows max,字符串以空格分割,for循环会把list列表依次输出
在这里插入图片描述

  1. 例子2,列表中包含"centos ubuntu" "windows 7 10"带空格的列表项,必须要用双引号括起来作为一个整体。
#!/bin/bash
##filename:for2.sh
for x in linux "centos ubuntu" windows "windows 7 10"
do
	echo "$x" ;
done

在这里插入图片描述
4. 例3,”== ls ==“是echo "$x"的输出结果,而40k这种信息是eval $x的输出结果(eval会将 $x 替换为没命令),然后执行命令,输出结果

#!/bin/bash
#filename:for3.sh
for x in ls "df -h" "du -sh"
do
	echo "==$x==" ; eval $x
done

在这里插入图片描述
5. 列表for循环执行流程:
首先将list的item1 赋给 variable,然后执行 do和done 之间的命令接着再将 list的item2赋给 variable,继续执行 do和done 之间的命令,如此循环,直到 list中的所有item值都已经用完才退出循环
在这里插入图片描述

不带列表for循环

  1. 不带列表的for循环执行是由用户指定参数和参数的个数,不带列表的for循环的基本格式:
不带列表的for循环的基本格式:
for	variable
	do
		command
		command
		..
	done

其中 do和done之间的命令称为循环体,shell 会自动地将命令行输入的所有参数依次组织成列表,每次将一个命令行输入的参数显示给用户,直至所有的命令行中的参数都显示给用户。

  1. 例子1,所有输入的内容,都是通过脚本参数传递进去的,所以说,不带列表的 for循环其实是使用位置参数变量 "$ @"来传递 for 中的 list列表,其实相当于for 循环省略了in$@关键字。
#!/bin/bash
#filename:for4.sh
i=1
for day ; do
	echo -n "positional parameter $((i++)): $day "
	case $day in
		[Mm]on|[Tt]ue|[Ww]ed|[Tt]hu|[Ff]ri)
			echo " (weekday)"
			;;
		[Ss]at[Ss]un)
			echo " (WEEKEND)"
			;;
		*) echo "(Invalid weekday)"
			;;
	esac
done


[root@localhost tmp]# sh for4.sh Mon Tue wed Thu Fri sat Sun ok
positional parameter 1: Mon  (weekday)
positional parameter 2: Tue  (weekday)
positional parameter 3: wed  (weekday)
positional parameter 4: Thu  (weekday)
positional parameter 5: Fri  (weekday)
positional parameter 6: sat (Invalid weekday)
positional parameter 7: Sun (Invalid weekday)
positional parameter 8: ok (Invalid weekday)

for循环举例

1.例1 所有文件名大写替换为小写
#!/bin/bash
##filename:for5.sh
for fname in * ;do
fn=$(echo $fname | tr A-Z a-z)
if [[ $fname != $fn ]] ; then mv $fname $fn ; fi
done

这个脚本的功能是将当前目录下的所有的大写文件名改为小写文件名。注意,脚本中的*表示当前目录下的文件和目录。首先使用命令替换生成小写的文件名,赋予新的变量f,如果新生成的小写文件名与原文件名不同,则改为小写的文件名。
在这里插入图片描述

2. 例2 读取/etc/passwd文件,依次输出ip段
#!/bin/bash
##filename:for6.sh
i=1
for username in `awk -F: '{print $1}' /etc/passwd`
do
	echo "Username $((i++)) : $username"
done

for suffix in $(seq 10)
do
	echo "192.168.0.${suffix}"
done

脚本实现两个功能:
第1个功能是读取/etc/passwd 文件,通过awk 获取第1列的内容作为 list,注意in 后面命令的写法,是个反引号,也就是键盘(Esc)下面的那个键,
第2个功能是通过seq 指定数字list,从1~10,然后依次输出一个IP 范围段
在这里插入图片描述

3. 例3 读取/etc/hosts内容for循环,执行ping
#!/bin/bash
#filename:for7_host.sh

for host in $(cat /etc/hosts)
do
	if ping -c1 -w2 $host &>/dev/null
	then
		echo "host ($host) is active."
	else
		echo "host ($host) is down."
	fi
done

这个脚本的功能是通过读取/etc/hosts 的内容作为 for循环的list,然后对读取到的内容进行ping 操作,如果能够ping通,显示active,否则显示DOWN。
在这里插入图片描述

4. 例4 循环ip列表,输出对应编号
#!/bin/bash
#filename:for8.sh
mynet="192.168.0"
for num in {1..6}
do
echo "IP Address $num: $mynet.$num"
done

for num in {1..10..2}
do
echo "Number: $num"
done

这个脚本是通过数值范围作为 for 循环的 lit 列表,1.6表示从1~6,而110…2是使用包含步长(increment)的数值范围作为for 循环的list,表示从1~10,每隔2个步长,执行脚本,输出如下:
在这里插入图片描述

5. 例5 批量添加用户
#!/bin/bash
#filename:for9.sh
for x in {1..10}
do
useradd user${x}
echo "centos"|passwd --stdin user${x}
chage -d 0 user${x}
done

这个脚本功能是批量添加10个Linux系统用户。需要注意的是,stdin 是接受echo后面的字符串作为密码,stdin 表示非交互,直接传入密码,passwd 默认是要用终端作为标准输入,加上–stdin 表示可以用任意文件做标准输入,于是这里用管道作为标准输入。最后的chage命令是强制新建用户第1次登录时修改密码。
在这里插入图片描述

break

break用于强行退出当前循环,格式如下:

break [n]

如果是嵌套循环,则 break 命令后面可以跟一数字 n,表示退出第n重循环(最里面的为第1重循环)。

1. 例1 break
#!/bin/bash
#filename:for10.sh
i=1
for day in Mon Tue Wed Thu Fri
do
	echo "Weekday $((i++)) : $day"
	if [ $i -eq 3 ]; then	#脚本是当变量i等于3的时候退出循环,初始值为1。
		break
	fi
done

在这里插入图片描述

continue

continue 用于忽略本次循环的剩余部分,回到循环的顶部,继续下一次循环,使用方法如下:

continue [n]

如果是嵌套循环,continue命令后面也可跟一数n,表示回到第n重循环的顶部。

1. 例1 continue
#!/bin/bash
##filename:for11.sh
i=1
for day in Mon Tue Wed Thu Fri Sat Sun
do
	echo -n "Day $((i++)) : $day"
	if [ $i -eq 7 -o $i -eq 8 ]; then
		echo "(WEEKEND)"
		continue
	fi
	echo "(weekday)"
done

这个脚本的含义是变量i等于1~6时,输出对应的day变量的值,并显示(weekday),当变量i等于7或者8时,输出(WEEKEND)。注意这里的S((i++)),默认i等于1,当第1个i变量传递到f语句中时,i已经是2了。执行上面脚本,输出如下:
在这里插入图片描述

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

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

相关文章

python:遗传算法(Genetic Algorithm,GA)求解23个测试函数

一、遗传算法 遗传算法(Genetic Algorithm,GA)起源于对生物系统所进行的计算机模拟研究,是一种随机全局搜索优化方法,它模拟了自然选择和遗传中发生的复制、交叉(crossover)和变异(mutation)等现象,从任一…

css之Flex弹性布局

文章目录 🐕前言:🏨定义flex容器 display:flex🏨在flex容器中子组件进行排列🪂行排列 flex-direction: row🪂将行排列进行翻转排列 flex-direction: row-reverse🏅按列排列 flex-direction: col…

统计二进制中1的个数

写一个函数返回参数二进制中 1 的个数。 比如: 15 0000 1111 4 个 1 我们先引入一个容易理解的例子,怎么得到一个十进制的数各个位置上的数为多少? 这里我们以一个十进制的三位数 123为例,要想得到它的个位,十位&#…

kubernetes-Service

文章目录 1、前言2、基本语法2.1 Service yaml2.2 关键字段2.3 port、nodePort、targetPort、containerPort字段说明 3、Service 类型3.1 ClusterIP3.2 NodePort3.3 LoadBalancer3.4 ExternalName 4、无头服务(Headless Services)5、访问service参考 1、…

R文件详细介绍、瘦身方案和原理

文章目录 1. 背景2. R文件介绍2.1 R文件概念2.1.1 标识符是怎么与资源联系起来的? 2.2 R文件内容2.3 library module和aar的R文件内容生成规则2.4 是谁生成的R文件?2.5 打包之后的R文件2.6 R文件为啥大?这么多? 3. 为什么R文件可以…

RK356x U-Boot研究所(开发篇)5.1 启动SATA硬盘中的固件

平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3RK356x支持从SATA硬盘中启动固件,只要板卡中有预留这个接口即可。值得注意的是,这个固件不能从maskrom阶段就直接进行加载,需要从别的媒介启动(Flash、eMMC或者TF卡)后跑到U-Boot阶段,在这个U-Boot阶段再去加载SATA硬盘…

黑豹程序员-架构师学习路线图-百科:Java的第二春Spring框架

文章目录 1、 Spring的发展历史2、为什么Spring能霸屏?2.1、容器的设计2.2、通过四个策略2.3、三种方式 3、学习编程设计的典范 1、 Spring的发展历史 正当SUN公司的EJB在全球开始热炒时,正当程序员纷纷转型EJB开发时,正当程序员为跑通EJB程…

昇腾CANN 7.0 黑科技:大模型训练性能优化之道

目前,大模型凭借超强的学习能力,已经在搜索、推荐、智能交互、AIGC、生产流程变革、产业提效等场景表现出巨大的潜力。大模型经过海量数据的预训练,通常具有良好的通用性和泛化性。用户基于“大模型预训练微调”开发范式即可在实际业务场景取…

量子力学期末复习--1

量子力学解题技巧--1 基础知识 薛定谔方程 Ehrenfest 定理 不确定性原理:正则对易关系:自由粒子:对于自由粒子,分离变量解不代表物理上可实现的态。但其含时薛定谔方程的一般解仍旧是分离变量解的线性组合 典型题目 自由粒子…

029-第三代软件开发-加载本地字体库

第三代软件开发-加载本地字体库 文章目录 第三代软件开发-加载本地字体库项目介绍加载本地字体库 关键字: Qt、 Qml、 QFont、 QFontDatabase、 ttf 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Langu…

深圳世有伯乐教育科技有限公司——LJ培训

今天来吐槽一波 深圳世有伯乐教育科技有限公司就是一个垃圾的培训机构,不,说是培训机构都是扭曲事实了,因为它根本就没有国家认可的办学许可证。光说没法让人信服,以下是企查查的截图: 世有伯乐的工商信息图片 续上&…

MPC预测控制概述和C++ 中的模型库

系列续篇: C 中的模型预测路径积分 (MPPI) 控制-CSDN博客 一、说明 以下文章描述了应用模型预测控制器的简单控制系统方法。本文讨论了这种类型的控制的基本机制,该机制适用于各种工程领域。 MPC 涉及对未来系统行为的预测(由一组方程描述的模…

.net6部署到linux上(CentOS Linux 7)

目录 一、先在linux上配置.net环境 添加 Microsoft 包存储库 安装 SDK 安装运行时 检查 SDK 版本可使用终端查看当前安装的 .NET SDK 版本。 打开终端并运行以下命令。 二、创建.net6 mvc项目 并发布 创建项目 修改默认端口 打包发布到文件夹 运行打包项目查看项目是否…

华为OD机试 - 代表团坐车 - 动态规划(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…

【vue】vue本地储存、会话存储插件vue-ls的使用:

文章目录 一、安装:二、vue项目中使用:三、API说明: 一、安装: npm install vue-ls -S 或 yarn add vue-ls二、vue项目中使用: //在vue项目中的入口文件main.js中引入import Storage from vue-ls;options {namespac…

DNS和ICMP协议

目录 一、DNS协议 二、ICMP协议 1.ICMP协议 2.ping命令 在讲完了OSI模型每层协议的讲解后,还有一些协议我们需要再讲解一下。 一、DNS协议 DNS是一整套从域名映射到IP地址的系统,也叫做域名解析服务,端口号为53。 我们生活中访问网站都…

微软 Win11 Dev 预览版 Build 23570 发布,修复文件资源管理器卡顿问题

本心、输入输出、结果 文章目录 微软 Win11 Dev 预览版 Build 23570 发布,修复文件资源管理器卡顿问题前言微软 Win11 Dev 预览版 Build 23570 发布,修复文件资源管理器卡顿问题完整的更新日志[Windows 中的 Copilot][开始菜单][任务栏搜索][设置] 已知问…

P1950 长方形

题目&#xff1a; P1950 长方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 算法&#xff1a; dp动态规划 代码&#xff1a; #include<iostream> #include<string> typedef unsigned long long ull; const int N 1010; using namespace std;int r, c, i, …

kali安装nodejs、npm失败

更新apt-get再安装&#xff0c;更新时间比较久&#xff0c;看网速&#xff0c;中间有一些确认步骤 22 apt-get update23 apt-get upgrade24 apt-get install nodejs25 node26 npm27 apt-get install npm

vulnhub靶机Funbox11

下载地址&#xff1a;Funbox: Scriptkiddie ~ VulnHub 主机发现 arp-scan -l 目标192.168.21.164 端口扫描 nmap --min-rate 1000 -p- 192.168.21.164 端口好多处理一下吧 nmap --min-rate 1000 -p- 192.168.21.164 |grep open |awk -F / {print $1} |tr \n , 端口服务版本…