shell脚本--循环语句、函数和数组(概念及实例)

shell脚本–循环语句、函数和数组

一、循环语句

1.1for语句的结构

●读取不同的变量值,用来逐个执行同一组命令
●for循环:指定次数循环;遍历:把集合中的每个元素挨个读取一遍

结构一:遍历集合
for 变量名 in 取值列表
do
     命令序列
done
结构二:指定次数
for ((i=1;i<=5;i++))
do
    命令序列
done

1.2for语句应用实例

实例1:
批量添加用户
用户名存放在user.txt文件中,每行一个
初始密码均设为123456
在这里插入图片描述

实例2:
根据IP地址检查主机状态
IP地址存放在ipadds.txt文件中,每行一个
使用ping命令检测各主机的连通性
在这里插入图片描述

1.3for语句中使用(( ))

使用以下符号需要先加let或者两个小括号((sum+=$i))
符号后面可以跟整数,也可以跟调用的变量
++ 自身变量加1 – 自身变量减1
+=5 自身变量加5 -=5 自身变量减5
*=5 自身变量乘5 /=5 自身变量除5
%=5 自身变量取余5
实例1:
在屏幕上输出1-10(三种方式)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实例2:
在屏幕上输出1-10;且输出循环结束后的数字
在这里插入图片描述

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

1.4while语句的结构

重复测试某个条件,只要条件成立则反复执行
注意:
if条件成立只执行一次,而while成立了会反复执行,直到不成立
for可以先定义一个集合,再通过临时变量进行遍历
实例1:
批量创建5个用户:
用户名以stu开头,按数字进行编号,即stu1、stu2……
初始密码均为123123
在这里插入图片描述

实例2:
输出1-100不能被3整除的数
在这里插入图片描述

1.5双重循环

外层循环控制行;内层循环控制列
外层循环执行一次,内层循环执行一遍
打印一个直角三角形
echo -n ##不换行输出
echo -e ##支持加反斜线转义的字符(例如 \t 是水平制表符)
实例:
直角三角形
在这里插入图片描述

扫描二维码关注公众号,回复: 11470694 查看本文章

九九乘法口诀表
在这里插入图片描述

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

1.6until语句

重复测试某个条件,只要条件不成立则反复执行;条件成立则退出循环

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

实例:
为指定用户发送在线消息
若用户不在线,则每6秒试一次,直至用户登录系统后再发送消息
用户名与消息通过位置参数传递给脚本
需求分析:
1.位置参数个数大于1;2.姓名是否属于系统用户
3.用户是否在线 until who 4.发送消息 echo “消息” | write 用户名
在这里插入图片描述

二、shell函数

2.1函数的定义

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

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

return:可以返回状态码或者数据(echo输出)
exit:只返回状态码

函数体外调用状态码或者值时:
return返回的是状态码,需要使用$?调用
echo 返回的是值,使用变量调用

传参:指位置变量

实例:
两个数字求和
通过sum(){ }定义函数
使用read命令交互输入两个数并求和
函数写好了要调用它才起作用!!
在这里插入图片描述
●调用函数的方法
函数名 [参数1] [参数2]
参数的表示方法:$ 1 $ 2 $ 3 ……$ {10} ${11}
在这里插入图片描述

2.2函数的作用范围

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

2.3递归函数

●调用自己本身的函数
实例:
递归遍历目录/var/log
通过定义递归函数list_files来实现
第一次循环:
$1 /var/log
$2 一个空格
第二次循环:
$1=$1/ $m /var/log/anaconda
$2=一个空格+$2 即两个空格
在这里插入图片描述

三、shell数组

3.1数组概述

数组:相同数据类型的集合 (例如整型、浮点型、字符串)
在内存中开辟了连续的空间
配合循环使用

举例:数组arr=(11 22 33 44)
数组名称:arr
数组元素:11,22,33,44
数组长度:4
数组下标:0 1 2 3(从0开始,例如33元素的下标值是2)

如何调用数组?
在这里插入图片描述

下面两种写法支持调用数组中所有或者单个元素
在这里插入图片描述

下面这种写法只支持调用数组中的所有元素,不支持单个元素

在这里插入图片描述

3.2数组定义方法

方法一:arr=(11 22 33 44)
方法二:arr=([0]=11 [1]=22 [2]=33 [3]=44)
方法三:list="11 22 33 44"
              arr=($list)

方法四:arr[0]=11
              arr[1]=22
              arr[2]=33
方法四可用来替换掉数组中的某一个元素

数组包括的数据类型:
●数值类型
●字符类型
使用“”或‘’定义

3.3创建数组实例

需求:创建一个1-100的数组
在这里插入图片描述
需求:创建一个存放(1-100)中奇数的数组
在这里插入图片描述
在这里插入图片描述

需求:创建可以自由添加自己想要的元素的数组
在这里插入图片描述

3.4常见数组操作
●获取数组长度:
${#数组名[*]}
●读取某下标赋值:
${数组名[下标]}
●数组遍历:

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

需求1:将班级中分数不满60分的加到60分
在这里插入图片描述

需求2:将最低分输出
在这里插入图片描述

需求2:将数组内的数字从小到大排序
使用冒泡排序
首先得了解a和b两个变量如何对调变量值:
a=10
b=20
方法(借助一个容器):
tmp=$ a
a=$ b
b=$tmp
在这里插入图片描述

●数组切片
${数组名[@]:起始位置:长度} 中间冒号隔开!!
在这里插入图片描述

●数组的替换 重点!!替换元素后再赋值给自己
${数组名[*]/查找字符/替换字符}
在这里插入图片描述
●数组删除
unset
在这里插入图片描述

注意!!
删除单个元素时,下标不会变,但是数组长度会减一
在这里插入图片描述
在这里插入图片描述

需求:删除数组中小于60的元素,将剩下的元素输出
在这里插入图片描述

四、shell脚本调试

●echo命令 ##常用
●bash命令
命令语法
sh [-nvx] 脚本名
●set命令
set -x:开启调节模式
set +x:关闭调节模式
在这里插入图片描述
检测结果如下,可以看到脚本执行的详细过程

[root@localhost ~]# sh -vx 60.sh 
#!/bin/bash
arr=(45 85 65 25 78 52)
+ arr=(45 85 65 25 78 52)
i=0
+ i=0
set -x
+ set -x
for v in ${arr[*]}
do
   if [ $v -lt 60 ];then
     unset arr[$i]
   fi
   let i++

done
+ for v in '${arr[*]}'
+ '[' 45 -lt 60 ']'
+ unset 'arr[0]'
+ let i++
+ for v in '${arr[*]}'
+ '[' 85 -lt 60 ']'
+ let i++
+ for v in '${arr[*]}'
+ '[' 65 -lt 60 ']'
+ let i++
+ for v in '${arr[*]}'
+ '[' 25 -lt 60 ']'
+ unset 'arr[3]'
+ let i++
+ for v in '${arr[*]}'
+ '[' 78 -lt 60 ']'
+ let i++
+ for v in '${arr[*]}'
+ '[' 52 -lt 60 ']'
+ unset 'arr[5]'
+ let i++
set +x
+ set +x
echo ${arr[@]}
85 65 78

猜你喜欢

转载自blog.csdn.net/chengu04/article/details/107486885