Shell脚本:循环语句(for,while,until);函数;数组

循环语句:

for语句结构

for循环:指定次数循环 遍历 :将集合当中每一个元素都读取一遍
读取不同的变量值,用来逐个执行同一组命令
语法先写for ,每一个都要加done;变量名从取值列表中去拿

结构形式:遍历集合

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

结构形式:指定次数

for ((i=1;i<=5;i++))
do
    命令序列
done

for循环语句的结构图
在这里插入图片描述

for语句示例

遍历集合:
批量添加用户将用户名存放在users.txt文件中,每行一个,初始密码均设为123456
在这里插入图片描述
示例二:
IP地址存放在ipadds.txt文件中,每行一个
使用ping命令检测各主机的连通性
-c 发几个包 -i 间隔几秒 -w等待几秒

#!/bin/bash
#定义一个集合list,赋值是否查看到的文件中的IP地址
list=$(cat /root/ip.txt)
#遍历集合中的IP地址
for ip in $list
do  
  ping -c 3 -s 0.2 -w 3 $ip  
  if [ $? -eq 0 ];then  
  echo "主机${ip}存活"  
  fi
done

示例三:
用指定次数输入
符号后面可以跟整数,也可以跟调用的变量
++ 自身变量+1 – 自身变量-1 let 可以单独用
+=5 自身变量+5
-=5 自身变量-5
*=5 自身变量*5
/=5 自身变量/5
%=5 自生变量取余5
(())要么用括号要么用let
输出1-10的数
在这里插入图片描述
示例四:
输出最终结果:
在这里插入图片描述
最后输出的结果为11,因为是输出10;然后进行let i++那一步加1变为11,去和i<=10去比较,不成立,数据就会输出,最后结尾加了输出最后结果,所以最后结果就为11;break退出当前循环

示例五:
将1-100中的奇数进行求和
注意:sum=0必须放在循环语句的上面(放在do下面每次sum都是从0开始)
在这里插入图片描述

While语句结构

重复测试某个条件,只要条件成立则反复执行
●for和while的区别
for可以用于去做遍历,指定次数
While 会一直循环的去执行,直到不成立就会停止
格式:

#!/bin/bash
while 条件测试操作
do
   命令序列
done

while结构图:
在这里插入图片描述

while示例

示例一:
用while语句输出1-20的数
在这里插入图片描述
示例二:
1-100不能被3整除的数:写法很多,这里用if写
continue:跳过continue以下语句,直接进入下一次循环
break:退出本次循环语句
在这里插入图片描述

双重循环

外层循环执行一次,内存循环执行一遍(周期循环)
-n:代表不换行输出
-e: 可带转译字符

双重循环示例

等腰三角形
在这里插入图片描述
在这里插入图片描述

until语句

当条件不成立时,实行until语句,当条件成立时就不会实行until语句

until语句示例

实例一:
计算1-50的和值
在这里插入图片描述
示例二:为指定用户发送在线消息
若用户不在线(未登录系统),则每5s试一次,直至用户登录系统后在发送信息用户名于消息通过位置参数传递给脚本
思路:
1.位置参数大于1
2.姓名属于系统用户 /etc/passwd
3.用户是否在线 until who
4.发送消息
在这里插入图片描述
当用户在线时,会受到信息
在这里插入图片描述
当用户不在线时,就不会收到:用户不在线
件不成立反复执行
在这里插入图片描述

Shell函数:

将命令序列按格式写在一起
可方便重复使用命令序列
shell函数定义

[ function ] 函数名(){
       命令序列
       [return x]      ##使用return或exit可以显式地结束函数
}

大括号范围内都是函数的内容,有时候会牵扯到一些高级用法:传入参数和返回值
return:可以返回状态码或者数据(echo输出)
exit:只返回状态码

Shell函数示例:

两个数字求和
调用函数要以命令的方式
函数写好了要调用它才起作用!!
在这里插入图片描述

调用函数的方法

函数名 [参数1] [参数2]
参数的表示方法:$ 1 $ 2 $ 3 ……$ {10} ${11}
如果想直接将这个数值拿过来用需要用echo
在这里插入图片描述

函数的作用范围

函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
一旦在函数内通过local来定义变量,只能在函数体内识别
在这里插入图片描述
在这里插入图片描述
local定义的函数体内的变量,可以通过函数体外先将函数赋值给一个变量,
再输出这个变量来引用local变量的值
在这里插入图片描述

递归函数:

调用自己本身
示例:
递归遍历目录/var/log
通过定义递归函数list_files来实现
第一次循环:
$1 /var/log
$2 一个空格

第二次循环:
$1=$1/ $m /var/log/anaconda
$2=一个空格+$2 即两个空格
在这里插入图片描述

Shell数组:

应用场景

获取数组长度
获取元素长度
遍历元素;元素切片;元素替换;元素删除

数组的概括

数组:相同类型的数据集合
[11.22.33.44] 在内存中开辟了连续的空间,往往配合循环去使用
数组名称 :arr=(11 22 33 44) arr就是数组名称
数组元素:11 22 33 44 每一个都是数组都是其中的一个元素
数组长度:有4个元素,长度为4
数组下标:第一个数字的下标值是0;依次后推

调用数组的方法

格式 :echo ${num[*]} 代表所有下标
在这里插入图片描述
第二种将
换为@也可以调用所有;单独调用:要加下标
在这里插入图片描述
第三种:先定义给列表在赋予给数组
在这里插入图片描述
方法四用于替换的,用于替换某一个元素
在这里插入图片描述

数组示例

1.创建存放(1-100)的奇数数组
在这里插入图片描述
2.创建任意数字及长度的数组,根据客户需求加入元素
在这里插入图片描述

获取数组长度

${#数组名[*]}
读取某下标赋值:
${数组名[下标]}
数组遍历:

for v in ${arr[@]}
do
  echo "$v"
done

示例1.
班级考试分数,判断分数是否大于60,未满足60直接赋予60
在这里插入图片描述
示例2:比较数组大小,将大的数值输出出来
在这里插入图片描述
排序算法:冒泡排序
每一轮的次数=数组长度-1
在这里插入图片描述
在这里插入图片描述
数组切片:
格式:${数组名[]:起始位置:长度}
示例:起始位置为1;长度为3;输出出来
在这里插入图片描述数组的替换:
${数组名[
]/查找字符/替换字符},这种方法不会变更原有的值、
在这里插入图片描述
想改变原有的值,直接重新定义,覆盖原有的
在这里插入图片描述
数组删除:
unset
删除单个元素;删除单个下标为2的元素
在这里插入图片描述
删除整个数组
在这里插入图片描述
数组删除示例:随意输入一段数组,将数组中少于60的数字删除
在这里插入图片描述
bash命令
命令语法:sh [-nvx]脚本名
常用选项:-n -v -x
在这里插入图片描述
set 命令 推荐使用echo
set -x:开启调节模式
set +x:关闭调节模式
在这里插入图片描述