Shell第三章编程之循环语句与函数

本文深入探讨Shell编程中的循环语句(for、while、until)及其应用,如用户创建、删除、IP检查等。同时讲解了Shell函数的创建、调用及参数传递,包括数组和冒泡排序等高级技巧,旨在提升生产环境中的自动化操作效率。
摘要由CSDN通过智能技术生成

Shell编程之循环语句与函数

文章目录


引言:在生产环境中,我们会遇到重复执行命令的操作,为了避免出现输入错误和重复工作的情况,可以通过编写脚本来实现自动化工作,本篇还会介绍函数的应用方法,也可以大大减少生产环境中某些任务的工作时长。

1.for循环语句结构

读取不同的变量值,用来逐个执行同一组命令;一般使用在已经知道要进行多少次循环的场景内

语句基本结构
for 变量名 in 取值列表
do
	命令序列
done

在这里插入图片描述

在这里插入图片描述
set -x可以看到详细for循环信息

2.1显示打印输出6个输出语句

打印出6个hello world;seq引用

for i in ` seq 6`		seq引用,还可引用变量
do
	echo "hello world"
done

在这里插入图片描述
在这里插入图片描述

2.2输出0-20之间的奇数和偶数
for i in {0..20..2}		0-20之间的偶数
do
	echo $i
done

补充:
	for i in {1..20..1}	0-20之间的奇数
	for i in {20..1}1-20之间倒序排列
	for in i {1..20}1-20之间正序排列
	for i in $(seq 10) seq方式1-10正序排列
	for i in $(seq 1 2 10)	1-10的奇数,中间为步长
	for i in $(seq 0 2 10)	0-10的偶数,中间为步长

在这里插入图片描述
在这里插入图片描述

2.3不带列表循环执行时的命令情况

在这里插入图片描述
在这里插入图片描述

2.4批量创建用户

在这里插入图片描述

2.5自定义用户名称,批量创建

user.txt自主创建,然后添加姓名

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6批量用户删除

在这里插入图片描述
在这里插入图片描述

2.7 根据ip地址列表查看主机状态

测试经常使用的几台主机能否ping通

先创建一个文件,输入内容为我们经常使用的Ip

定义变量,查看文件内容的ip地址,通过pingmingl看能够联通

正常为up,否则为down

在这里插入图片描述
在这里插入图片描述

2.8测试某个网段Ip主机哪些能够Ping通

在这里插入图片描述
在这里插入图片描述

2.9 判断密码输入是否正确在这里插入图片描述在这里插入图片描述
2.10 幸运会员抽奖脚本

#!/bin/bash
a=0
b=0
c=0
d=0
for ((i=1;i<=10;i++))
do
        num=$(expr $[RANDOM%4+1])
        LIST=$(cat user.txt | grep $num | awk -F: '{print $2}')
        case $LIST in
        zhangsan)
        let a++
        ;;
        lisi)
        let b++
        ;;
        wangwu)
        let c++
        ;;
        *)
        let d++
        esac
        echo "$LIST"
done
        echo "zhangsan: $a次,lisi:$b次,wangwu: $c次,其他: $d次"


在这里插入图片描述

在这里插入图片描述

3.for循环嵌套
3.1嵌套循坏星星的格式

格式一:

在这里插入图片描述
在这里插入图片描述

格式二:
在这里插入图片描述
在这里插入图片描述

3.2九九乘法表

正三角
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

倒三角

在这里插入图片描述
在这里插入图片描述

3.3随机生成密码(要求复杂性)

方法一

#!/bin/bash
#随机生成密码脚本
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*"
num=${#key}
#设置初始密码为空
pass=' '
#循环18次,生成18位随机密码
for i in {1..18}
do
        index=$[RANDOM%num]
        pass=$pass${key:$index:1}
done
echo $pass

在这里插入图片描述
在这里插入图片描述

**方法二:**使用mkpasswd 命令生成随机密码

mkpasswd命令的作用:生成应用用户的复杂性密码,选择将其应用于用户登录

使用mkpasswd命令前需要按照expect包

mkpasswd 常用选项:
-c:定义再密码中小写字母字符的最小数目,默认值是2
-C:定义在密码中大写字母字符的最小数目,默认值是2
-s:定义在密码中特殊字符的最小数目,默认值是1
-p:指定程序来设置密码,默认情况下,如果存在使用/etc/passwd,否则使用/bin/passwd
-d:定义密码的最小数目,默认值为9
-l:定义口令的长度,默认值为9
-v:导致密码设置互动可见

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4三个数大小排序

#!/bin/bash
read -p "请输入一个整数:" num1
read -p "请输入一个整数:" num2
read -p "请输入一个整数:" num3
th=1
if [ $num1 -gt $num2 ];then
        tmp=$num1
        num1=$num2
        num2=$tmp
        fi
if [ $num1 -gt $num3 ];then
        tmp=$num1
        num1=$num3
        num3=$num1
        fi
if [ $num2 -gt $num3 ];then
        tmp=$num2
        num2=$num3
        num3=$num2
        fi

echo "排序后从小到大数据排序为:$num1,$num2,$num3"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、while语句的结构

1.while语法结构
while循环一般用于有条件判断的循环,若判断条件为真进入循环,判断条件为假跳出循环


while 条件测试操作
do
	命令序列
done

在这里插入图片描述

2.while循环案例:
2.1打印1-5

打印1~5,到6跳出循环

到6跳出循环;
在这里插入图片描述
在这里插入图片描述

另一种写法
在这里插入图片描述

2.21-100之间不能被三整除的数字

在这里插入图片描述
在这里插入图片描述

2.3查看apache服务运行状态

在这里插入图片描述
在这里插入图片描述

2.4猜数字游戏

在这里插入图片描述不用exit,也可以用break或contiune
在这里插入图片描述

2.5while方法批量创建用户

在这里插入图片描述
在这里插入图片描述

2.6shell脚本下统计var下的日志文件并显示

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

3.break与continue

continue 语句和 break 语句的区别是,continue 语句只结束本次循环,而不是终止整个循环。break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立,并执行当前循环之后的语句。而且,continue 只能在循环语句中使用,即只能在 for、while 和 do…while 中使用,除此之外 continue 不能在任何语句中使用。

break 3 跳出单个循环,后面数字3代表跳出三层循环

countinue 中止某次循环中的命令,但是不会完全中止命令

3.1break

在这里插入图片描述
在这里插入图片描述

3.2countinue

在这里插入图片描述
在这里插入图片描述

3.3contunue例题

在这里插入图片描述
在这里插入图片描述

3.4break简单例题

在这里插入图片描述
在这里插入图片描述

4.1猜随机商品的价格
SUIJI=`expr $RANDOM % 1000`
a=0
echo "商品实际价格为0~999,尝试看几次能猜中"
while true
do
        read -p "请输入你认为的金额 " num
        let a++
        if [ $num -eq $SUIJI ];then
        echo "恭喜你猜对了,实际价格就是$SUIJI"
        echo "总计猜$a 次"
        exit
        elif [ $num -gt $SUIJI ];then
        echo "不好意思,大了哈"
        elif [ $num -lt $SUIJI ];then
        echo "再猜,小了点 "
        fi
done

在这里插入图片描述
在这里插入图片描述

4.2商城活动,定义网络流量

在这里插入图片描述
在这里插入图片描述

三、until循环语句结构

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

只要while后面的命令退出状态为0,while循环就一直执行下去,until命令与while命令相似,唯一的区别在于,只要until后面的命令退出不为0.until循环就一直执行下去,也就是说,使用until语句重复执行一段代码条件为真位置,与while类似

util 条件测试操作
do
	命令序列
done

在这里插入图片描述

计算1~20和相加的和

在这里插入图片描述

四.Shell函数

1.shell函数概述

将命令序列格式写在一起

可方便重复使用命令序列

Shell函数定义

2.函数基本格式
[function]	函数名(){
	命令序列
	[return x]				使用return或exit可以显示结束函数
}

或者

函数名(){
	命令序列
}


调用函数的方法

函数名 [参数1] [参数2]

函数

重名只认最后一个

从上往下运行,

3.Shell函数示例
3.1函数的简单格式

在这里插入图片描述
在这里插入图片描述

函数重名时,只执行最后一个
在这里插入图片描述

在这里插入图片描述

与顺序无关,必须要有函数调用;由上往下依次执行
在这里插入图片描述
在这里插入图片描述

3.2配置yum本地源仓库脚本自动运行

在这里插入图片描述

3.3函数的作用范围
  • 函数在Shell脚本中尽在当前Shell环境中有效

  • Shell脚本中变量默认全局有效

  • 将变量限定在函数内部使用local命令

3.4return的用法

"echo $?"一般返回值为0 ,return可以定义 "echo $?"返回值不为0也表示正确
在这里插入图片描述

4.传参
4.1传参的简单案例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2判断是否为文件

在这里插入图片描述

不为文件输出为40
在这里插入图片描述

5.阶乘。

方法一

#!/bin/bash
jiecheng (){
num=1
for i in {1..8}		#阶乘为(8*7*6*5*4*3*2*1)
do
let num=$i*$num
done
echo $num
#echo输出放在函数内,for循环外才可以,否则会把每次>相加的数据都显示出来
}
jiecheng

在这里插入图片描述
在这里插入图片描述

方法二

在这里插入图片描述
在这里插入图片描述

6.递归函数

在这里插入图片描述
在这里插入图片描述

列出目录文件列表,目录用颜色表示(蓝色),文件显示层级关系

调用自己本身的函数;

7.Shell数组的使用方法

数组是存放相同类型数据的集合,在内存中开辟l连续的空间,通常配合循环使用

数组的分类:

  • 普通数组:不需要声明直接定义,下标索引只能是整数
  • 关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串

数组的定义方式 (30 20 10 60 50 40 )

​ 0 1 2 3 4 5

第一种:直接把要加入数组的元素用小括号括起来,中间用空格分开

num=(11 22 33 44)

${#num} 显示字符串长度

数组名= (value0 value1 value2)

第二种:精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续

num=(11 22 33 44)

数组名=([0]=value [1] =value [2] =value…)

第三种:先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组

list=“11 12 13 14”

num= ($list)

数组应用场景:获取数组长度、获取元素长度、遍历元素、元素切片、元素替换、元素删除
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.冒泡排序

数组排序算法:冒泡排序

类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动

**基本思想:**冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像旗袍一样从底部上升到顶部

**算法思路:**冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了,而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少

#!/bin/bash
array=(90 70 80 100 30 66)
echo "old_array:${array[*]}"
lt=${#array[*]}
#定义比较轮数;比较轮数为数组长度减一,从1开始
for ((i=1;i<$lt;i++))
do
#确定比较元素位置,比较两个相邻元素,较大的数往后放,比较次数随比较轮数而减少
        for ((j=0;j<$lt-i;j++))
        do
                #定义第一个元素的值
                first=${array[$j]}
                #定义第二个值
                two=$[j+1]
                second=${array[$two]}
                #如果第一个元素比第二个元素大就互换位置
                if [ $first -gt $second ];then
                #把第一个元素的值保存到临时的变量中
                 temp=$first
                #把第二个元素值赋给第一个元素
                 array[$j]=$second
                #把临时的变量赋给第二个元素
                 array[$two]=$temp
                fi
        done
done
echo "new_array:${array[@]}"
~                                  

在这里插入图片描述

总结

根据在生产环境当中的经验,总结以上一些基本的语句结构和函数的使用方法,基本都是通过一些案列来演示各个语句结构的功能和使用方法;分别介绍了:(1)for语句的结构;(2)whil语句的结构(3)until语句的结构(4)Shell函数的定义方法;以及数组的定义方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值