文章目录
前言
我们日常的操作都是需要执行指令的,有的操作需要多次执行一条或多条相关的命令,那么我们就可以通过一个或多个循环来执行命令。
一、循环结构
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循环相当于是不满足条件进行循环
- 不同的循环语句也可以与前面的条件判断等命令进行搭配使用,满足条件循环,不满足则结束
数组的定义方法不唯一
- 直接把要加入数组的元素用小括号括起来,中间用空格分开
- 精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
- 先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
- 可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素