当前位置: 首页 > news >正文

循环+函数

循环+函数

一、循环语句

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

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

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

示例1:
下面使用for循环语句从列表文件中读取多个用户,然后为其逐一创建用户账户并设置密码。
首先创建用户名称的列表文件users.txt,每个用户名称单独一行。

#!/bin/bash
for i in ` cat /root/users.txt `
do useradd $i; echo 123456 | passwd --stdin $i
done
[root@ws ~]# ./a.sh 
更改用户 m 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 bob 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 marry 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 rose 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 mike 的密码 。
passwd:所有的身份验证令牌已经成功更新。

接下来编写shell标本addusers.sh。在脚本中使用read命令读取用户输入的密码值,然后赋值给PASSWD
变量,并通过-p参数向用户显示一段提示信息,告诉用户正在输入的内容即将作为账户密码

#!/bin/bash
for i in ` cat /root/users.txt `
do useradd $i
read -p "请输入$i用户的密码:" PASSWD
echo $PASSWD | passwd --stdin $i
done
[root@ws ~]# ./a.sh 
请输入jim用户的密码:111
更改用户 jim 的密码 。
passwd:所有的身份验证令牌已经成功更新。
请输入bob用户的密码:222
更改用户 bob 的密码 。
passwd:所有的身份验证令牌已经成功更新。
请输入marry用户的密码:333
更改用户 marry 的密码 。
passwd:所有的身份验证令牌已经成功更新。
请输入rose用户的密码:444
更改用户 rose 的密码 。
passwd:所有的身份验证令牌已经成功更新。
请输入mike用户的密码:555
更改用户 mike 的密码 。
passwd:所有的身份验证令牌已经成功更新。

示例2:
循环输出1-10

#!/bin/bash
for ((i=1;i<=10;i++))
doecho $i
done
[root@ws ~]# ./b.sh 
1
2
3
4
5
6
7
8
9
10

示例3:
用for语句,输出1-100的所有整数和

#!/bin/bash
a=0
for ((i=1;i<=100;i++))
doa=$[ $a+$i ]
done
echo $a
[root@ws ~]# ./b.sh 
5050

示例4:
根据IP地址检测主机状态
主机列表

[root@ws ~]# vim iplist

192.168.110.10
192.168.110.20
192.168.110.30

#!/bin/bash
for i in ` cat /root/iplist `
do
ping -c 4 $i &>/dev/null
if [ $? -eq 0 ];thenecho "$i能通"
elseecho "$i不能通"
fi
done
[root@ws ~]# ./a.sh 
192.168.110.10能通
192.168.110.20不能通
192.168.110.30不能通

2、while语句
重复测试某个条件,只要条件成立,则反复执行

示例1:
显示0-10的所有整数


#!/bin/bash
a=0
while [ $a -le 10 ]
doecho $alet a++
done
[root@ws ~]# ./c.sh 
0
1
2
3
4
5
6
7
8
9
10

示例2:
求1-100的整数和

#!/bin/bash
a=0
b=0
while [ $a -le 100 ]
dob=$(($a+$b))((a++))
done
echo $b
[root@ws ~]# ./c.sh 
5050

随机数

[root@ws ~]# expr 555 % 1000
555
[root@ws ~]# expr $RANDOM % 1000
733
[root@ws ~]# expr $RANDOM % 1000
472

示例3:

随机猜数字游戏,100以内的猜数字游戏

#!/bin/bash
num=$(expr $RANDOM % 100)
a=0
echo "数字范围为0-100的整数,猜猜看"
while true
do
read -p "请输入值:" n
((a++))
if [ $n -lt $num ];thenecho "你输入的值小了"
elif [ $n -gt $num ];thenecho "你输入的值大了"
elseecho "恭喜你 猜对了"echo "你猜的次数为$a"exit
fi
done
[root@ws ~]# ./e.sh 
数字范围为0-100的整数,猜猜看
请输入值:50
你输入的值大了
请输入值:40
你输入的值小了
请输入值:45
你输入的值大了
请输入值:43
恭喜你 猜对了
你猜的次数为4

3、until语句
重复测试某个条件,只要条件不成立,则反复执行

示例1:
练习
求1-100的整数和

#!/bin/bash
a=0
b=0
until [ $a -ge 100 ]
dob=$(($a+$b))((a++))
done
echo $b
[root@ws ~]# ./b.sh 
5050

4、双for循环
即在一个for循环内部再加一个for循环

#!/bin/bash
for (( i=1;i<=3;i++))
doecho "i=$i"for (( e=1;e<=4;e++))doecho "e=$e"done
done
[root@ws ~]# bash f.sh 
i=1
e=1
e=2
e=3
e=4
i=2
e=1
e=2
e=3
e=4
i=3
e=1
e=2
e=3
e=4

5、break和continue
在内循环执行break 就跳出当前的内循环了,去执行外循环了
作用:
1跳出当前循环
2并且break下面的语句不去执行

(1)break,我们可以通过内外循环的输出来看break的特性。

#!/bin/bash
for (( i=1;i<=3;i++))
doecho "i=$i"for (( e=1;e<=4;e++))doif [ $e -eq 2 ];thenbreakfiecho "e=$e"donedone
[root@ws ~]# bash f.sh 
i=1
e=1
i=2
e=1
i=3
e=1

内循环到2就停止了,3就不去判断了

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

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

二、函数

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

1、shell函数定义格式

function 函数名{

命令序列

}

函数名(){

命令序列

}

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

测试案例

#!/bin/bash
function ws {read -p "请输入任意一个整数:" nreturn $[$n*2]
}
ws
echo "$?"
请输入任意一个整数:3
6
[root@ws ~]# ./a.sh 
请输入任意一个整数:200
144

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

(1)传参

#!/bin/bash
sum1 () {sum=$[ $1 + $2 ]echo $sum
}
sum1 $1 $2
[root@ws ~]# ./b.sh 12 13
25

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

#!/bin/bash
a () {echo "函数内的未经过local的变量i值$i"local ii=7echo "函数内的变量i值是$i"
}
i=8
a
echo "函数外面的变量i值是$i"
[root@ws ~]# ./b.sh 
函数内的未经过local的变量i值8
函数内的变量i值是7
函数外面的变量i值是8

(3)local的进击

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

4、递归(调用自己)

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

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

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

vim ee.sh
#!/bin/bash
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
}
vim ff.sh
#!/bin/bash
. /root/ee.sh
read -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@ws ~]# ./ff.sh 
请输入第一个数字:8
请输入第二个数字:4
两数之和为: 12
两数之差为: 4
两数之积为: 32
两数之商为: 2

文章转载自:

http://04tZcHRP.wchsx.cn
http://fRQhMS5a.wchsx.cn
http://L4yQOuy4.wchsx.cn
http://wkJ2RJnh.wchsx.cn
http://KPetfCyv.wchsx.cn
http://8Rh5NOuB.wchsx.cn
http://Do3Y9Huu.wchsx.cn
http://fHnSbyh5.wchsx.cn
http://BiWP9ZZ1.wchsx.cn
http://nKaGhBjO.wchsx.cn
http://1H4D0YHG.wchsx.cn
http://CZljcauA.wchsx.cn
http://xR7r4XMO.wchsx.cn
http://0LeP4ZZa.wchsx.cn
http://iu1WuYwo.wchsx.cn
http://htLUX8HX.wchsx.cn
http://uhMfDNnb.wchsx.cn
http://JALg4Pck.wchsx.cn
http://XjXfvO9T.wchsx.cn
http://I51TScDe.wchsx.cn
http://fUJT32m4.wchsx.cn
http://84FI4BZ5.wchsx.cn
http://VQClaKqQ.wchsx.cn
http://6zlyTPtd.wchsx.cn
http://RuzE2Dmy.wchsx.cn
http://tONgxvWF.wchsx.cn
http://YrJRCFS2.wchsx.cn
http://TJROPBxg.wchsx.cn
http://B9iBznkn.wchsx.cn
http://xv2NXjkX.wchsx.cn
http://www.dtcms.com/a/377144.html

相关文章:

  • leetcode-hot100 11.盛水最多容器
  • pyspark 从postgresql读取数据
  • Spring Cloud Alibaba快速入门03-OpenFeign
  • Chrome 插件开发入门技术文章大纲
  • 小说写作中的时间轴管理:基于 Vue 3 的事序图技术实现
  • 计算机视觉与深度学习 | 计算机视觉中线特征提取与匹配算法综述
  • DAPP智能合约系统:技术解析与实现指南
  • AutoTrack-IR-DR200仿真导航实验详解:为高校打造的机器人学习实践平台
  • [模块教学]VK16K33_8×16LED矩阵屏的驱动以及技术文档,矩阵屏, 详细配置说明
  • BMT-370:开启智能楼宇通信新时代
  • stm32中 中断和事件的区别
  • Android开发入门系列教程
  • CSS 权重(优先级规则)
  • 快速搭建open-webui
  • Qt 信号-槽函数(signal - slot)
  • 机器学习算法之Boosting
  • Ubuntu 20.04手动安装.NET 8 SDK
  • NSGA-II多目标优化算法:原理、应用与实现
  • 盼之代售 最新版 decode__1174
  • maven , mvn 运行 项目
  • WPF常见问题清单
  • Devops-Hi Git
  • Maven多环境配置指南:用Profile实现开发/测试/生产环境无缝切换
  • python常量变量运算符
  • JDBC接口
  • 图形基础算法:如何将点与带曲线边的多边形位置关系算法做稳定
  • 深圳南柯电子|EMC干扰问题整改:患者安全优先的零风险操作方案
  • Java全栈开发面试实战:从基础到微服务的完整技术栈解析
  • 关于发布生成式人工智能服务已备案信息的公告(2025年7月至8月)
  • 深度学习基本模块:ConvTranspose1D 一维转置卷积层