shell循环-函数

循环语句

for循环详解

 for循环语句允许脚本一次性读取多个信息,然后注意对信息进行操作处理。当要处理的数据有范围时,使用for循环语句就再合适不过了

读取不同的变量值,用来逐个执行同一组命令

for循环语法

for  变量名  in  取值列表
do
   命令序列(命令行)
done

 示例

       下面使用for循环语句从列表文件中读取多个用户,然后为其逐一创建用户账户并设置密码。
 

首先创建用户名称的列表文件users.txt,每个用户名称单独一行。
vim  /root/users.txt
jim
bob
marry
rose
mike接下来编写shell标本addusers.sh。在脚本中使用read命令读取用户输入的密码值,然后赋值给PASSWD
变量,并通过-p参数向用户显示一段提示信息,告诉用户正在输入的内容即将作为账户密码vim  /root/addusers.sh
#!/bin/bash
read -p "enter the user password:" PASSWD
for UNAME in `cat /root/users.txt`
douseradd $UNAMEecho "$PASSWD" | passwd --stdin $UNAMEecho "$UNAME",create success
done执行
[root@node1 ~]# chmod +x addusers.sh [root@node1 ~]# ./addusers.sh 
enter the user password:linux
Changing password for user jim.
passwd: all authentication tokens updated successfully.
jim,create success
Changing password for user bob.
passwd: all authentication tokens updated successfully.
bob,create success
Changing password for user marry.
passwd: all authentication tokens updated successfully.
marry,create success
Changing password for user rose.
passwd: all authentication tokens updated successfully.
rose,create success
Changing password for user mike.
passwd: all authentication tokens updated successfully.
mike,create success

 示例

#!/bin/bash
for ((i=1;i<=10;i++))               //自增1
do
        echo $i
done
 

for ((i=1;i<=10;i+=2))               //自增2
 

示例

用for语句,输出1-100的所有整数和
#!/bin/bash
a=0                                  //先定义一个和的变量
for ((i=1;i<=100;i++))
do
        a=$(($a+$i))          //循环赋值(1+..+100)的和给a
done

echo "1-100所有整数相加的和未$a"

示例

根据IP地址检测主机状态
主机列表
vim  /root/iplist
192.168.100.10
192.168.100.20
192.168.100.30vim  b.sh
#!/bin/bash
ip=$(cat /root/iplist.txt)
for i in $ip
do
ping -c 3 $i &>/dev/null
if [ $? -eq 0 ];thenecho "$i通"
elseecho "$i不通"
fi
done

while语句

重复测试某个条件,只要条件成立,则反复执行

示例

显示0-10的所有整数

#!/bin/bash
a=0
while [ $a -le 10 ]
doecho $alet a++
done

示例

求1-100的整数和

#!/bin/bash
i=0
n=1
while [ $n -le 100 ]
do
i=$(( $i + $n ))
let n++
done
echo "1-100的和为:$i"

随机数 

[root@node1 ~]#  expr 555 % 1000
555
[root@node1 ~]# expr $RANDOM % 100
4
[root@node1 ~]# expr $RANDOM % 100
43
[root@node1 ~]# expr $RANDOM % 100
60
[root@node1 ~]# expr $RANDOM % 1000
406
[root@node1 ~]# expr $RANDOM % 1000
921
 

示例

随机猜数字游戏,1000以内的猜数字游戏
#!/bin/bash
num=$(expr $RANDOM % 1000)
a=0
echo "数字范围为0-999的整数,猜猜看"
while true
do
read -p "请输入你猜的整数:" n
let a++
if [ $n -eq $num ];thenecho "恭喜你答对了,数字为$num"echo "你总共猜了$a次"exit 0
elif [ $n -gt $num ];thenecho "你猜高了"
elseecho "你猜低了"
fi
done

until语句

重复测试某个条件,只要条件不成立,则反复执行
 

双for循环

即在一个for循环内部再加一个for循环

#!/bin/bash
for ((a=1;a<=5;a++))
doecho "a=$a"for ((b=1;b<=5;b++))doecho "b=$b"done
done

 break和continue

在内循环执行break 就跳出当前的内循环了,去执行外循环了
作用:
1跳出当前循环
2并且break下面的语句不去执行
(1)break,我们可以通过内外循环的输出来看break的特性。

#!/bin/bash
#break
for(( a=1;a<=5; a++ ))
doecho "outside $a"for ((b=1;b<=5;b++ ))doif [ $b -eq 4 ]thenbreak                   #这里当b=4的时候,进行break,不进行后面的输出$b.fiecho "inside $b "donedone[root@node1 ~]# ./d.sh 
outside 1
inside 1 
inside 2 
inside 3 
outside 2
inside 1 
inside 2 
inside 3 
outside 3
inside 1 
inside 2 
inside 3 
outside 4
inside 1 
inside 2 
inside 3 
outside 5
inside 1 
inside 2 
inside 3 

(2)continue
中止某次循环,不会完全终止整个命令
 

#!/bin/bash
#continue
for (( a=1;a<=15;a++))
doif [ $a -gt 5 ] && [ $a -lt 10 ]thencontinuefiecho " $a "
done[root@node1 ~]# ./d.sh 1 2 3 4 5 10 11 12 13 14 

函数 

将命令序列按格式写在一起
可重复使用命令序列

1、shell函数定义格式


function 函数名{ 

   命令序列
   
 }


  函数名(){ 
  
    命令序列
    
  }
 

2、函数返回值
return
return 表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值(0-255)
原则:
1.函数已结束就取返回值,因为 $? 只是对最后一条命令进行判断
2.0-255,超出时 除以256取余
echo也能直接返回
 

例:

#!/bin/bash
#测试
function cz {read -p "请输入任意一个整数值:" nreturn $[$n*2]
}cz
echo "$?"[root@rhel8 ~]# ./aa.sh 
请输入任意一个整数值:40
80
[root@rhel8 ~]# ./aa.sh 
请输入任意一个整数值:250
244
[root@rhel8 ~]# ./aa.sh 
请输入任意一个整数值:256
0

函数传参

函数变量的作用范围(局部变量以及全局变量)
函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定一个函数的内部local,即局部变量
 

1.传参

#!/bin/bash
sum1 () {sum=$[ $1 + $2 ]echo $sum
}
sum1 $1 $2[root@rhel8 ~]# ./bb.sh 20 30
50
[root@rhel8 ~]# ./bb.sh 1 6
7

2.变量的局部与全局

将变量限定在函数内部使用local命令
即这个local的变量仅仅在当前的函数内有效,在别的函数中无效。

#!/bin/bash
abc () {echo "函数内的未经过local的变量i值$i"local ii=6echo "函数内的变量i值是$i"
}
i=9
abc
echo "函数外面的变量i值是$i"[root@rhel8 ~]# ./cc.sh 
函数内的未经过local的变量i值9
函数内的变量i值是6
函数外面的变量i值是9

3.local的进阶

#!/bin/bash
abc () {echo "inside1 $i"let i++local ii=8echo "inside2 $i"
}
i=9
abc
echo "outside $i"[root@rhel8 ~]# ./cc.sh 
inside1 9
inside2 8
outside 10

4.递归(调用自己)

#!/bin/bash
function cy() {if [ $1 -eq 1 ];thenecho 1elselocal temp=$[ $1 - 1 ]local result=`cy $temp`echo $[ result * $1 ]fi
}
read -p "输入一个值:" vaule
result=`cy $vaule`
echo "阶乘的值为: $result"[root@rhel8 ~]# ./dd.sh 
输入一个值:5
阶乘的值为: 120
[root@rhel8 ~]# ./dd.sh 
输入一个值:3
阶乘的值为: 6

 

函数库 

就是把一般脚本的主体执行代码和定义函数部分相互分离,把定义的函数部分集中放在同一个脚本中。
具体执行的时候,只需要直接进行调用函数集合的脚本文件即可。

这里我把加减乘除共4个函数,做了一个函数库。
 

[root@rhel8 ~]# cat ee.sh 
#!/bin/bash
#ee.sh函数库
jia() { result=$[ $1 + $2 ]echo "$result"
}jian() { result=$[ $1 - $2 ]echo "$result"
}cheng() { result=$[ $1 * $2 ]echo "$result"
}chu() {if [ $2 -ne 0 ];thenresult=$[ $1 / $2 ]echo "$result"elseecho "除法中分母不能为0"fi
}[root@rhel8 ~]# cat ff.sh 
#!/bin/bash
. /root/ee.shread -p "请输入第一个数字:" n
read -p "请输入第二个数字:" mresult1=`jia $n $m`
result2=`jian $n $m`
result3=`cheng $n $m`
result4=`chu $n $m`echo "两数之和为: $result1"
echo "两数之差为: $result2"
echo "两数之积为: $result3"
echo "两数之商为: $result4"[root@rhel8 ~]# chmod +x ff.sh 
[root@rhel8 ~]# ./ff.sh 
请输入第一个数字:5 
请输入第二个数字:2
两数之和为: 7
两数之差为: 3
两数之积为: 10
两数之商为: 2

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

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

相关文章

全国糖酒会,就这5个字。“会天下美味”

“全国糖酒会&#xff0c;会天下美味”&#xff0c;是全国糖酒会的品牌口号。这个品牌口号来的非常偶然。 两年前&#xff0c;全国糖酒会准备更新标志之时&#xff0c;也设计了一个品牌口号。新标志发布前几天&#xff0c;临时作了调整&#xff0c;最终变成了“全国糖酒会&…

linux下oracle启动及关于pfile和spfile启动参数文件的配置

在现代企业环境中&#xff0c;Oracle数据库作为关键的业务支撑平台&#xff0c;承载着大量的数据处理和事务管理任务。 无论是对于DBA&#xff08;数据库管理员&#xff09;还是开发人员来说&#xff0c;掌握Oracle数据库的基本操作和配置技巧都是至关重要的。本文提供了一份全…

Flutter基本组件Text使用

Text是一个文本显示控件&#xff0c;用于在应用程序界面中显示单行或多行文本内容。 Text简单Demo import package:flutter/material.dart;class MyTextDemo extends StatelessWidget {const MyTextDemo({super.key});overrideWidget build(BuildContext context) {return Sca…

Protobuf库的使用

文章目录 Protobuf是什么Protobuf使⽤流程介绍ProtoBuf的使用创建.proto⽂件指定proto3语法package声明符定义消息&#xff08;message&#xff09;编译contacts.proto⽂件命令如下&#xff1a;序列化与反序列化的使⽤ Protobuf是什么 ProtoBuf&#xff08;全称ProtocolBuffer…

【Python基础】Python函数

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、函数的定义与调用三、函数参数3.1 位置参数3.2 默认参数3.3 可变数量参数&#xff08;或不定长参数…

若依框架登录鉴权详解(动态路由)

若依框架登录鉴权&#xff1a;1.获取token&#xff08;过期在响应拦截器中实现&#xff09;,2.基于RBAC模型获取用户、角色和权限信息&#xff08;在路由前置守卫&#xff09;&#xff0c;3.根据用户权限动态生成&#xff08;从字符串->组件&#xff0c;根据permission添加动…

【C++进阶】hash表的封装

文章目录 hash表哈希表的关键组成部分哈希表的优缺点优点&#xff1a;缺点&#xff1a; 常见应用场景 开放定址法实现hash表负载因子 (Load Factor)负载因子的意义负载因子的影响再散列 (Rehashing)示例 整体框架insertFinderasehash桶封装框架insertfinderase~HashTable() 总结…

银行结算业务

1.1 银行本票 银行本票是由银行签发的,承诺自己在见票时无条件支付票款给收款人或持票人的业务。银行本票按票面划分为定额本票和不定额本票,按币种划分为人民币银行本票和外币银行本票。人民币银行本票仅在同一交换区域内使用,资金清算利用当地人民银行组织的资金清算形式…

多个vue项目部署到nginx服务器

文章目录 需求一、项目打包1.vue.config.js2.request.js文件3.打包 二、nginx配置 需求 同一个域名安装多个vue项目。 比如&#xff1a;域名为 https://domain.com 后缀。那么通过不同的后缀就能去访问不同的项目地址。 https://domain.com&#xff0c;不加任何后缀&#x…

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0006页 寻找重复数 今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一&#xff0c;是道好题&#xff0c;不过我们还是得先理解了它才…

微信小程序中如何监听元素进入目标元素

Page({onLoad: function(){// 如果目标节点&#xff08;用选择器 .target-class 指定&#xff09;进入显示区域以下 100px 时&#xff0c;就会触发回调函数。wx.createIntersectionObserver().relativeToViewport({bottom: 100}).observe(.target-class, (res) > {res.inter…

合宙4G模组Air780EX——产品规格书

Air780EX 是合宙通信推出的LTE Cat.1 bis通信模块&#xff1b; Air780EX采用移芯EC618平台&#xff0c;支持LTE 3GPP Rel.13 技术&#xff1b; Air780EX 是4G全网通模块&#xff0c;可适应不同的运营商和产品&#xff0c;确保产品设计的最大灵活性。 其主要特点和优势可以总…

maven配置文件常用模板

注释很详细&#xff0c;直接上代码 项目结构 内容 父项目 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

高德地图SDK Android版开发 10 InfoWindow

高德地图SDK Android版开发 10 InfoWindow 前言相关类和方法默认样式Marker类AMap类AMap.OnInfoWindowClickListener 接口 自定义样式(视图)AMap 类AMap.ImageInfoWindowAdapter 接口 自定义样式(Image)AMap.ImageInfoWindowAdapter 接口 示例界面布局MapInfoWindow类常量成员变…

【数学建模国赛思路预约】2024全国大学生数学建模竞赛助攻思路、代码、论文

2024年全国大学生数学建模大赛马上就要开始了&#xff0c;大家有没有准备好呢&#xff0c;今年将会和之前一样&#xff0c;将会在比赛赛中时期为大家提供比赛各题的相关解题思路、可运行代码参考以及成品论文。 一、分享计划表如下所示 1、 赛中分享内容包括&#xff08;2023国…

高并发内存池(二):​整体框架的介绍与ThreadCache的实现

目录 整体框架介绍 ThreadCache的主体框架 自由链表-FreeList 内存对齐-RoundUp 计算桶位置-Index 基础版 进阶版 线程局部存储 __declspec(thread) 关键字 实现线程无锁 申请内存-Allocate 释放内存-Deallocate 从中心缓存中申请内存 整体框架介绍 高并发内存池…

机器学习引领未来:赋能精准高效的图像识别技术革新

图像识别技术近年来取得了显著进展,深刻地改变了各行各业。机器学习,特别是深度学习的突破,推动了这一领域的技术革新。本文将深入探讨机器学习如何赋能图像识别技术,从基础理论到前沿进展,再到实际应用与挑战展望,为您全面呈现这一领域的最新动态和未来趋势。 1. 引言 …

kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)

背景介绍&#xff1a; Confluence是一个专业的企业知识管理与协同软件。使用简单&#xff0c;但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论&#xff0c;信息推送。 这里介绍的使用的是Confluence 7.2.0版本的。 一、在kubernetes集群部署 1…

本地零阶提示优化

本文探讨了如何优化大型语言模型&#xff08;LLM&#xff09;中的提示&#xff08;prompt&#xff09;&#xff0c;以更有效地利用这些黑盒模型的能力。传统的优化方法倾向于寻找全局最优解&#xff0c;但在某些情况下这种做法可能表现不佳。通过对提示优化进行深入的研究&…

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储&#xff0c;载入镜像和删除镜像 1.4 Doecker…