shell循环和函数

目录

  • 1.for循环
  • 2.while循环
  • 3.until循环
  • 4.函数

1.for循环

for循环是固定循环,也就是在循环时就已经知道需要进行几次的循环,有事也把for循环成为计数循环。for的语法如下两种:
语法一

for 变量 in 值1 值2 值3 …(可以是一个文件等)do程序done这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。

语法二

for (( 初始值;循环控制条件;变量变化 ))do程序done语法二中需要注意:
初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。

语法一举例

vim test1.sh
#!/bin/bash
#打印时间for time in morning   afternooon  eveningdoecho "This time is $time"
done      ##执行脚本
[root@tdm1 ~]# bash test1.sh 
This time is morning
This time is afternooon
This time is evening

语法一举例:批量压缩脚本

[root@localhost ~]$ vim test2.sh
#!/bin/bash
#批量解压缩脚本cd/lamp
#进入压缩包目录
ls *.tar.gz > ls.log
#把所有.tar.gz结尾的文件的文件覆盖到ls.log 临时文件中
for i in $(cat ls.log) `
#或者这样写for i in `cat ls.log`#读取ls.log文件的内容,文件中有多少个值,就会循环多少次,每次循环把文件名赋予变量idotar -zxf $i &>/dev/null#加压缩,并把所有输出都丢弃done
rm -rf /lamp/ls.log
#删除临时文件ls.log

语法二举例:从1加到100

vim test3.sh
#!/bin/bash
#从1加到100
s=0
for ((i=1;i<=100;i=i+1))
dos=$(( $s+$i ))
done
echo "1+2+3+..+100总和为$s"##执行脚本
[root@tdm1 ~]# bash test3.sh 
1+2+3+..+100总和为5050

语法二举例:批量添加指定数量用户

vim test4.sh
#!/bin/bash
#输入用户名,保存变量
read -p "please input user name: " -t 30 name
#输入添加用户的数量,保存变量
read -p "please input the number of users " -t 30 num
#输入密码,保存变量
read -p "please input the password for users: " -t 30 pass#判断三个变量不为空
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
#执行循环
thenfor  (( i=1; i<=$num; i=i+1 ))do#添加用户,用户名为$name$i,产生的输出到垃圾桶useradd $name$i >>/dev/null 2>&1#设置密码echo $pass | passwd --stdin $name$i >>/dev/null 2>&1done
else#三个变量有一个为空,则退出echo " wrong ! exit !"
fi##执行脚本
[root@tdm1 ~]# bash test.sh 
please input user name: test
please input the number of users 5
please input the password for users: 123456
[root@tdm1 ~]# cat  /etc/passwd |  grep test
test1:x:1000:1000::/home/test1:/bin/bash
test2:x:1001:1001::/home/test2:/bin/bash
test3:x:1002:1002::/home/test3:/bin/bash

语法二举例:批量删除用户

vim test5.sh
#!/bin/bash
#批量删除用户
#读取文件信息,awk切割出用户名
user=$( cat /etc/passwd | grep test | awk -F ":" '{print $1}' )
#循环,有多少用户,循环多少次
for i in $userdo#删除用户userdel -r $idone##执行脚本
[root@tdm1 ~]# bash test5.sh
[root@tdm1 ~]# cat /etc/passwd  | grep test
[root@tdm1 ~]# 

2.while循环

对while循环来讲,只要条件判断式成立,循环就一直会继续,直到条件判断式不成立,循环才会停止。

语法

while [ 条件判断式 ]do程序done

案例:1加到100

vim test6.sh
#!/bin/bash
#从1加到100
#给变量赋值
i=1
s=0
#如果变量i的值小于100,则执行循环
while [ $i -le 100 ]
dos=$(( $s+$i ))i=$(( $i+1 ))
done
echo "This sum is $s"##执行脚本
[root@tdm1 ~]# bash test6.sh 
This sum is 5050

案例:输入的数值进行比较

vim test7.sh
#!/bin/bash
price=$(( $RANDOM % 10 ))
times=0
echo "商品的价格在0-10之间,猜猜是多少?"
while true
doread -p "请输入您猜的价格: " numlet times++if [ $num -eq $price ]thenecho "您猜对了,价格是$price"echo "您总共猜了$times次"exit 0elif [ $num -gt $price ]thenecho "太高了!"elseecho "太低了!"fi
done##执行脚本
[root@tdm1 ~]# bash test7.sh 
商品的价格在0-10之间,猜猜是多少?
请输入您猜的价格: 5
太低了!
请输入您猜的价格: 7
太高了!
请输入您猜的价格: 6
您猜对了,价格是6
您总共猜了3次

3.until循环

和while循环相反,until循环是只要判断式成立则进行循环,一旦判断式成立,则终止循环。

语法:

until [ 条件判断式 ]do程序done

案例:1加到100

vim test8.sh
#!/bin/bash
i=1
s=0
#循环直到i大于100,就停止循环
until  [ $i -gt 100 ]
dos=$(( $s + $i ))i=$(( $i + 1))
done
echo "This sum is $s"##执行脚本
[root@tdm1 ~]# bash test8.sh 
This sum is 5050

4.函数

语法:

function 函数名 () {程序
}

案例:接受用户输入的数字,然后从1加到这个数字

vim test9.sh
!/bin/bash
#定义函数
sum() {s=0for (( i=0;i<=$num;i=i+1 ))dos=$(( $i + $s ))doneecho "1+2+3+..+$num: $s"
}#接收用户输入的数字,并把值赋予变量num
read -p "please input  a  number: " -t 30 num#把变量num的值替换为空,并赋予变量y
y=$( echo $num | sed 's/[0-9]//g'  )#判断变量y是否为空,以确定变量num中是否为数字
if [ -z $y  ]then#调用sum函数,并把变量num的值作为第一个参数传递给sum函数sum $sumelse#如果变量num 的值不是数字,则输出报错信息echo "error,please input a  number!"
fi##执行脚本
[root@tdm1 ~]# bash test9.sh 
please input  a  number: 10
1+2+3+..+10: 55

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

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

相关文章

【深度学习】 Python 和 NumPy 系列教程(十四):Matplotlib详解:1、2d绘图(下):箱线图、热力图、面积图、等高线图、极坐标图

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 0. 设置中文字体 1-5. 折线图、散点图、柱状图、直方图、饼图 6. 箱线图&#xff08;Box Plot&#xff09; 7. 热力图&#xff08;Heatmap&#xff09; 8. 面积图&#xff08;Area Plot&#xff09; 9. 等…

RabbitMQ超详细安装教程(Linux)

RabbitMQ超详细安装教程&#xff08;Linux&#xff09; RabbitMq介绍

Go 工具链详解(五):竞态条件检测神器 Race Detector

并发编程可以提高程序的性能和稳定性&#xff0c;但也带来了一些挑战&#xff0c;如竞态条件。竞态条件是指并发程序中的多个线程同时访问共享资源&#xff0c;导致程序行为不确定的问题。为了避免竞态条件的产生&#xff0c;需要使用同步机制&#xff08;如互斥锁、条件变量等…

consul 备份还原导入导出

正文 工作中要保证生产环境部署的consul的集群能够安全稳定地对外提供服务&#xff0c;即使出现系统故障也能快速恢复&#xff0c;这里将讲述部分的备份还原操作及KV的导入导出操作。 备份与还原 配置文件、服务器状态 需要备份的主要有两类数据&#xff1a;consul相关的配置文…

淘客商品动态字符商品id转数字id

{ "code": 200, "data": { "itemId": "700407841432", "itemName": "安踏花苞短裤女五分裤夏季新款速干冰丝高腰宽松裤子透气工装短裤", "itemVideo": { "itemVideoThum…

Layui快速入门之第八节 表格渲染与属性的使用

目录 一&#xff1a;表格的渲染 API 方法配置渲染 模板配置渲染 静态表格渲染 二&#xff1a;表格的属性 基础属性 异步属性 返回数据中的特定字段 表头属性 重载 完整重载 仅数据重载 2.7 获取选中行 设置行选中状态 2.8 获取当前页接口数据 获取表格缓存数…

腾讯云2023年云服务器优惠活动价格表

腾讯云经常推出各种云产品优惠活动&#xff0c;为了帮助大家更好地了解腾讯云服务器的价格和优惠政策&#xff0c;下面给大家分享腾讯云最新云服务器优惠活动价格表&#xff0c;助力大家轻松上云&#xff01; 一、轻量应用服务器优惠活动价格表 1、轻量应用服务器&#xff1a;…

【JAVA - List】差集removeAll() 四种方法实现与优化

一、场景&#xff1a; 二、结论&#xff1a; 1. 四种方法耗时 三、代码&#xff1a; 一、场景&#xff1a; 求差集 List1 - Lsit2 二、结论&#xff1a; 1. 四种方法耗时 初始条件方法名方法思路耗时 List1.size319418 List2.size284900 List..removeAll(Lsit2)1036987ms…

LINQ的内部联接、分组联接和左外部联接

最近在优化定时任务相关的代码&#xff0c;建议是把总查询放到内存中去坐&#xff0c;尽量减少打开的数据库连接 1. 内连接 指的是结果生成两张表可以连接的部分 private void button1_Click_1(object sender, EventArgs e){//初始化Student数组Student[] arrStu new Stude…

群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程

群晖Cloud Sync数据同步到百度云、另一台群晖、nextcloud教程 一、群晖套件中下载Cloud Sync 二、同步到百度云盘 打开Cloud Sync&#xff0c;点击左上角的号&#xff0c;云供应商选择百度云。 这里可以选择双向备份&#xff0c;也可以只上穿到百度云的仅上传本地更改。因为百…

STM32H7 Azure RTOS

STM32H7 是意法半导体&#xff08;STMicroelectronics&#xff09;推出的一款高性能微控制器系列&#xff0c;基于 Arm Cortex-M7 内核。它具有丰富的外设和高性能计算能力&#xff0c;适用于各种应用领域。 Azure RTOS&#xff08;原名 ThreadX&#xff09;是一款实时操作系统…

第36章_瑞萨MCU零基础入门系列教程之步进电机控制实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

LeetCode题解:1720. 解码异或后的数组,异或,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/decode-xored-array/ 解题思路&#xff1a; 异或有如下性质&#xff1a; a ^ a 0a ^ 0 aa ^ b b ^ a 根据题意&#xff0c;已知encoded[i - 1] arr[i - 1] ^ arr[i]&#xff0c;可以做如下转换&#xff1a; encoded[i…

python爬虫经典实例(二)

在前一篇博客中&#xff0c;我们介绍了五个实用的爬虫示例&#xff0c;分别用于新闻文章、图片、电影信息、社交媒体和股票数据的采集。本文将继续探索爬虫的奇妙世界&#xff0c;为你带来五个全新的示例&#xff0c;每个示例都有其独特的用途和功能。 1. Wikipedia数据采集 爬…

Redis 7 第九讲 微服务集成Redis 应用篇

Jedis 理论 Jedis是redis的java版本的客户端实现&#xff0c;使用Jedis提供的Java API对Redis进行操作&#xff0c;是Redis官方推崇的方式&#xff1b;并且&#xff0c;使用Jedis提供的对Redis的支持也最为灵活、全面&#xff1b;不足之处&#xff0c;就是编码复杂度较高。 …

【区块链 | IPFS】IPFS cluster私有网络集群搭建

对于联盟链的业务中搭建一个私有网络的 IPFS 集群还是很有必要的,私有网络集群允许 IPFS 节点只连接到拥有共享密钥的其他对等节点,网络中的节点不响应来自网络外节点的通信。 IPFS-Cluster 是一个独立的应用程序和一个 CLI 客户端,它跨一组 IPFS 守护进程分配、复制和跟踪 …

易基因: MeRIP-seq等揭示组蛋白乙酰化和m6A修饰在眼部黑色素瘤发生中的互作调控|肿瘤研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 组蛋白去乙酰化抑制剂(HDACis)在多种恶性肿瘤中显示出令人鼓舞的结果。N6-甲基腺嘌呤(m6A)是最普遍的mRNA修饰&#xff0c;在肿瘤发生调控中起重要作用。然而&#xff0c;对组蛋白乙酰化…

HDMI 直通 ILA 调试实验

FPGA教程学习 第十四章 HDMI 直通 ILA 调试实验 文章目录 FPGA教程学习前言实验原理程序设计实验过程实验尝试总结TODO 前言 HDMI 输入直通到 HDMI 输出的显示&#xff0c;完成一个简单的 HDMI 输入输出检测。 实验原理 开发板 HDMI 输出接口芯片使用 ADV7511&#xff0c;HD…

穿山甲报错 splashAdLoadFail data analysis error

使用swift接入穿山甲&#xff0c;未接入GroMore&#xff0c;这个时候如果代码位配置错误会导致如下错误&#xff1a; splashAdLoadFail(_:error:) Optional(“Error Domaincom.buadsdk Code98764 “data analysis error” UserInfo{NSLocalizedDescriptiondata analysis error,…

什么是区块链,解释区块链的原理和应用场景

1、什么是区块链&#xff0c;解释区块链的原理和应用场景。 区块链是一种分布式数据库&#xff0c;它由一系列按照时间顺序排列的数据块组成&#xff0c;并采用密码学方式保证不可篡改和不可伪造。区块链技术最初起源于比特币&#xff0c;作为比特币的底层技术&#xff0c;用于…