Shell编程之循环语句与函数的使用


前言

我们日常的操作都是需要执行指令的,有的操作需要多次执行一条或多条相关的命令,那么我们就可以通过一个或多个循环来执行命令。


一、循环结构

1、for循环

格式

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

在这里插入图片描述

循环的使用方法

在这里插入图片描述
也可以通过seq来循环列出数据
在这里插入图片描述
!!注意若循环没有值则不会显示出结果
在这里插入图片描述
将for循环写入脚本
在这里插入图片描述
如上的for循环脚本只显示了运行的结果,若是想要显示出循环的过程可以加入一句set -x的命令
在这里插入图片描述

案例

需求1:批量添加用户,要求将用户名存放在user.txt文本中(每行一个用户名),设置其初始密码为123456,并验证脚本的真实性
在这里插入图片描述
需求2:根据IP地址检查主机状态,IP地址存放在IPLIST.txt文本中(每行一个IP地址),使用ping命令来检测各个主机的连通性
在这里插入图片描述

循环嵌套

嵌套就是在一个循环中在添加一个循环进去

for 变量名1 in 取值列表1
do
	命令序列1
	for 变量名2 in 取值列表2
	do
	命令序列2
	done
done
案例

对称性显示图片
在这里插入图片描述
九九乘法表的显示
在这里插入图片描述

2、while循环

while就是重复测试某个条件,只药条件成立则反复执行

格式

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

在这里插入图片描述

案例

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

continue 与 break 语句的区别

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

在这里插入图片描述
把循环的命令嵌套进行使用
在这里插入图片描述
在这里插入图片描述

3、until循环

重复测试某个软件,只要条件不成立则会反复执行
在这里插入图片描述

格式

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

案例

计算1~50之间的和值
在这里插入图片描述


二、Shell函数

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

Shell函数的定义

方法一
function 函数名 {
	命令序列
	return x	#也可使用exit来显示函数的结束运行
}

方法二
函数名 (){
	命令序列
}
  • 调用函数的方法
函数名 [参数1] [参数2]

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

函数的作用范围

  • 函数咋Shell脚本中尽在当前Shell环境中有效
  • Shell脚本中变量默认全局有效
  • 将变量限定在函数内部使用local命令

示例

函数内部变量通过local来实现
通过定义myfun函数,在其内部设置局部变量
函数内部和外部分别赋值,进行结果验证

在这里插入图片描述
若不设置举报变量,则i=6默认为全局变量,则先给i赋值为8则会被覆盖,最后输出的值为6
在这里插入图片描述
函数调用并返回值
在这里插入图片描述

写一个配置yum本地源的脚本
在这里插入图片描述

函数的参数

用法

函数名称 参数1 参数2 参数3...
#参数的表示方法
	$1 $2 $3......${10} ${11}....${n}

示例

在这里插入图片描述
我们也可以通过参数的传递来进行文件目录的删除
在这里插入图片描述

阶乘的运算

输出的位置会影响最后运行的结果
在这里插入图片描述
在这里插入图片描述

递归函数

递归函数就是调用自己本身的函数
通过递归的方式起来计算输入的值
在这里插入图片描述

在这里插入图片描述


三、Shell数组

数组的定义

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

数组的分类

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

数组的定义方式

第一种:直接把要加入数组的元素用小括号括起来,中间用空格分开
	num=(11 22 33 44)

第二种:精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
	num=([0]=55 [1]=66 [2]=77 [4]=88)

第三种:先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
	list=“11 12 13 14”
	num=($list)

第四种:可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素
	num=(`cat /etc/passwd`)
	[root@localhost ~]# echo ${#num[*]}
	111
	[root@localhost ~]# echo ${num[0]}
	root:x:0:0:root:/root:/bin/bash

数组的格式

arr=(11 22 33 44)
数组名称:arr
数组元素:11,12,12,14,数组元素默认是以空格分隔的
数组长度:4,有4个元素
数组下标:每个数组元素都有一个下标索引,一般从0开始,33是数组第三个元素,但是它的下标索引是2

注意
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
删除数组
在这里插入图片描述
在这里插入图片描述

冒泡排序

方法一:定义变量来存放元素
在这里插入图片描述
方法二:直接冒泡在这里插入图片描述

四、Shell脚本的调试

echo命令

echo -n 表示不换行输出

echo -e 输出转义字符,将转义后的内容输出到屏幕上


echo可以对符号进行的转义,常用的转义字符如下:  
\b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。

\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。

\n 换行,被输出的字符从"\n"处开始另起一行。

\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;

\v 与\f相同;

\t 转以后表示插入tab,即横向制表符;

\r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖

\\ 表示插入"\"本身;

bash命令

##命令语法
	sh [-nvx] 脚本名
	-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示
	-v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本。如果有错误,也会给出错误提示。
	-x:将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数。

set命令

set -n :读取命令单并不执行
set -v :显示读取的所有行
set -x :显示所有命令及其参数
set +x :关闭显示

总结

循环语句的使用:可以通过for、while、until语句来实现循环

  • for循环可以限定循环的次数
  • while循环可以对条件进行判断,若满足条件则可以继续循环
  • until循环相当于是不满足条件进行循环
  • 不同的循环语句也可以与前面的条件判断等命令进行搭配使用,满足条件循环,不满足则结束

数组的定义方法不唯一

  • 直接把要加入数组的元素用小括号括起来,中间用空格分开
  • 精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
  • 先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
  • 可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值