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

43.shell脚本循环与函数

shell脚本循环与函数

for 循环

for 循环用于一次性读取多个信息,逐一对信息进行操作处理,特别适合处理有范围的数据

语法
for 变量名 in 取值列表
do命令序列
done
批量创建用户
#!/bin/bashtouch /root/users.txt
echo aka blues cloe dio foks > /root/users.txtread -p "给用户设置密码:" PASSWD
for i in `cat /root/users.txt`
douseradd $iecho "$PASSWD" | passwd --stdin $iecho "$i"用户创建成功
done

在这里插入图片描述

循环输出
#!/bin/bash
echo "自增"
for ((i=1;i<=10;i++))
doecho $i
doneecho "自减"
for ((i=10;i>=1;i-=2))
doecho $i
done

在这里插入图片描述

计算数字1-100的整数和
#!/bin/bash
a=0
for ((i=1;i<=100;i++))
doa=$(($i+$a))
done
echo "1-100所有整数和为 $a"

在这里插入图片描述


while 循环

while 循环重复测试某个条件,只要条件成立就反复执行

显示 0-10 的所有整数

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

在这里插入图片描述

计算 1-100 的整数和

#!/bin/bash
a=0
b=1
while [ $b -le 100 ]
doa=$(($a+$b))let b++
done
echo "1-100的和: $a"

在这里插入图片描述

猜数字游戏

随机猜1000以内的数字

#!/bin/bash
num=$(expr $RANDOM % 1000)
a=0
echo "猜数字的范围为0-999的整数"
while true
do
read -p "请输入你猜的数:" nlet a++
if [ $n -gt $num ];thenecho "猜的数字过大"
elif [ $n -lt $num ];thenecho "猜的数字过小"
elseecho "恭喜你猜对了"echo "你猜的次数为 $a"exit
fi
done

在这里插入图片描述


until 循环

until 循环重复测试某个条件,只要条件不成立就反复执行(与while相反)

求1-100的整数和

#!/bin/bash
a=0
b=1
until [ $b -gt 100 ]
doa=$(($a+$b))let b++
done
echo "1-100的和: $a"

在这里插入图片描述


双for循环

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

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

a每加1,b就循环一次

在这里插入图片描述

break 和 continue
  • break:跳出当前循环
  • continue:中止某次循环,不会完全终止整个命令
#!/bin/bash
for ((a=1;a<=3;a++))
doecho "a=$a"for((b=1;b<=5;b++))doif [ $b -eq 3 ];thenbreak	#当b=3时,就停止运行fiecho "b=$b"
done
done

在这里插入图片描述

#!/bin/bash
for ((a=1;a<=10;a++))
do
if [ $a -gt 4 ]&&[ $a -lt 8 ];thencontinue	#当a大于4小于8时,停止循环
fiecho "$a"
done

在这里插入图片描述


用shell脚本写一个九九乘法表
#!/bin/bash
for ((i=1; i<=9; i++))
dofor ((o=1; o<=i; o++))dolet c=$i*$oecho -n "$i*$o=$c "doneecho ""
done
[root@xieyuhui ~]# bash a.sh 
1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

函数

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

函数定义格式
# 方式一
function 函数名 {命令序列
}# 方式二
函数名() {命令序列
}

使用 return 退出函数并返回一个退出值(0-255),通过 $? 显示

#!/bin/bash
function x {read -p "请输入任意一个整数:" nreturn $[$n*2]
}
x
echo "$?"

在这里插入图片描述

函数传参

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

#!/bin/bashnum1 (){num=$[ $1+$2 ]echo $num
}
num1 $1 $2

在这里插入图片描述


局部变量与全局变量

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

#!/bin/bashabc (){echo "为经过local的变量$i"	#此时局内变量未定义,因此是全局变量i=9local ii=6echo "函数内的变量$i"	  #此时局内变量已定义,因此为i=6
}
i=9
abc
echo "外面变量$i"		#局内定义的变量只能在定义的函数中使用,因此此处为全局变量

在这里插入图片描述

递归函数

递归函数调用自身

#!/bin/bashfunction a(){if [ $1 -eq 1 ];thenecho 1elselocal temp=$[$1-1]local result=`a $temp`echo $[result * $1 ]fi
}read -p "输入一个值:" va
result=`a $va`
echo "阶乘的值为: $result"

在这里插入图片描述


函数库

将常用函数集中放在一个脚本中,在需要使用时直接调用即可

先写一个函数库

[root@xieyuhui ~]# vim hsk.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
}
[root@xieyuhui ~]# chmod +x hsk.sh
[root@xieyuhui ~]# vim aa1.sh
#!/bin/bash
. /root/hsk.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"

在这里插入图片描述


文章转载自:

http://sPQB7erV.LpmLx.cn
http://Q2x5srhX.LpmLx.cn
http://dRxe9Cew.LpmLx.cn
http://scz7xvdA.LpmLx.cn
http://JZ6hiw1N.LpmLx.cn
http://LBqrSbWr.LpmLx.cn
http://eseKZwr5.LpmLx.cn
http://FLRMmeLs.LpmLx.cn
http://bnhxZnzZ.LpmLx.cn
http://R9BbuWX9.LpmLx.cn
http://BLVe3rXb.LpmLx.cn
http://pYe9tJmE.LpmLx.cn
http://xQoqOFbj.LpmLx.cn
http://4nfnb7G2.LpmLx.cn
http://eeDI1KPk.LpmLx.cn
http://7Pu3Kt6z.LpmLx.cn
http://pZY9cdIt.LpmLx.cn
http://pcYL8Agu.LpmLx.cn
http://wddnVlSe.LpmLx.cn
http://6QSYr74p.LpmLx.cn
http://L0uGcMeE.LpmLx.cn
http://8tJx8TIy.LpmLx.cn
http://UZDMpIvu.LpmLx.cn
http://6TPv22H1.LpmLx.cn
http://59oENfb0.LpmLx.cn
http://nGu0zNLb.LpmLx.cn
http://TJ23RGZb.LpmLx.cn
http://A3AWCEQr.LpmLx.cn
http://HDb5cBWh.LpmLx.cn
http://YFtrG45P.LpmLx.cn
http://www.dtcms.com/a/376233.html

相关文章:

  • 数据整理器(Data Collators)(90)
  • (贪心、数学、二分)洛谷 P9755 CSPS2023 种树 题解
  • 反相放大器电路和T形网络反相放大电路与仿真
  • C++的诗行:一文读懂C++的继承机制
  • ubuntu 22 安装轻量级桌面Xfce并使用xrdp远程桌面连接
  • PixVerse -免费在线AI视频生成工具
  • 赋能数字孪生:Paraverse平行云实时云渲染平台LarkXR,提供强大的API与SDK用于二次开发和深度集成
  • 【JVS更新日志】低代码、APS排产、物联网、企业计划9.10更新说明!
  • 一维差分(扫描线)基础篇
  • Umi-OCR:Windows7和Linux上可免费离线使用的OCR应用!
  • 系统是Rocky Linux 9.6,用比对工具compare beyond 工具中私钥连接连不上
  • 计算机毕设 java 高校饭堂点餐系统 基于微信小程序 + SSM 的高校餐饮服务平台 Java+MySQL 的点餐与运营系统
  • 高效计算的源泉:深入浅出冯诺依曼模型与操作系统的管理艺术 —— 构建稳定、高效的应用基石 【底层逻辑/性能优化】
  • CSS 继承 (Inheritance)
  • 计算机视觉cv2入门之实时人脸检测
  • 增值税电子发票查验-财政票据查验接口-全电票查验api
  • 【第23话:定位建图】SLAM后端优化方法详解
  • 异步处理(前端面试)
  • ArKTS登录界面开发
  • 用于树莓派的sd卡格式是什么适合,它现在是exFAT,需要是FAT32吗
  • 使用Qoder 改造前端UI/UE升级改造实践:从传统界面到现代化体验的华丽蜕变
  • HTML HTML基础(4)
  • 【Matlab】-- 机器学习项目 - 基于XGBoost算法的数据回归预测
  • 在企业中风控规则引擎的解决方案是什么?
  • StarRocks导入数据-使用 Broker Load 进行异步导入
  • GaussDB闪回技术
  • OpenResty 配合 Lua 脚本的使用
  • 浅聊一下Redisson分布式锁
  • kdump使用方法和场景介绍
  • 提示词工程深度实践:从基础原理到生产级应用优化