目录
一、For循环语句
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同
当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代码更是显得异常烦琐、困难重重
for循环里面又有3个不同的循环如下:
1.基于列表的“for”循环
语法格式:
for 变量名 in {list}
do
commands
done
输出0-20之间的偶数
输出0-20之间的奇数
2.不带列表的循环
语法结构:
for 变量名
do
command
done
3.C风格的“for”循环
语法结构:
for (( expr1; expr2; expr3 ))
do
commands
done注:
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
注:i++ : i=1+1 先赋值再运算 i=1 之后 再 +1
++i : 1+1=i 先运算再赋值 1+1 之后 再=i
类C风格运算符用法:
++ 自身变量+1
-- 自身变量-1
+=2 自身变量+2
-=2 自身变量-2
*=2 自身变量*2
/=2 自身变量/2
%=2 自身变量%2
批量创建用户
批量添加用户(需要先提前创建一个文件里面有要添加的用户)
批量删除用户
根据 IP 地址列表检查主机状态
有限次数内每个人中将的次数
二、while循环语句
1.语法结构
while 表达式
do
command
done
1.1while死循环
写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
while [ 1 -eq 1 ]
do
command
done
while true
do
command
done
while :
do
command
done
猜数字,猜不对就一直猜
定义网卡流量
进店购物
三、until循环语句
1.语法结构
跟while相反,条件为假进入循环,条件为真退出循环
until 表达式
do
command
done
计算1-50的和1275两种写法
1.1until死循环
语句结构
until false
do
command
doneuntil [ 1 -ne 1 ]
do
command
done
四、循环控制语句
for循环一般会搭配条件判断语句和流程控制语句一起执行,那么就会出现需要跳过循环和中止循环的情况,控制循环的命令有以下3个
1、continue
继续,但不会执行循环体内下面的代码了,开始重新开始下一次循环
2、break
打断,马上停止本次循环,执行循环体外的代码
3、exit
直接跳出程序,后面可跟状态返回码如exit 1等等
五、shell函数
1.函数定义的两种方式
一、
function 函数名 {
command
} //这是一种规范写法二、
函数名(){ //最常用因为最简洁
command
}
2.函数的调用
函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用
定义的时候哪怕出现语法错误也没关系,不调用就不会报错
当然我们写函数最终目的还是为了调用,为了实现某个功能块直接在脚本里定义函数的代码块后写函数名即可完成调用
函数名必须是唯一,如果先定义了一个,再用同样的名称定义,第二个会覆盖第一个的功能,出现了你不想要的结果,所以这里一定要注意不要重名!
自动搭建yum以及挂载
3.函数的作用范围
在Shell脚本中函数的执行并不会开启一个新的子Shell,而是仅在当前定义的Shell环境中有效。如果Shell脚本中的变量没有经过特殊设定,默认在整个脚本中都是有效的。在编写脚本时,有时需要将变量的值限定在函数内部,可以通过内置命令local来实现。函数内部变量的使用,可以避免函数内外同时出现同名变量对脚本结果的影响
shell脚本中变量默认全局有效
local命令:将变量限定在函数内部使用
上述脚本中myfun函数内部使用了local命令设置变量a,其作用是将变量a限定在函数内部。myfun函数外部同样定义了变量a,内部变量a和全局变量a互不影响。脚本执行时先调用了函数myfun,函数内部变量a为2,所以输出结果是2。调用完函数之后,给变量a赋值为5,再打印外部变量a,所以又输出5
4.两种参数
4.1函数的参数
4.2脚本的参数
通过脚本传递参数给函数中的位置参数$1
#!/bin/bash
fun1() {
rm -rf $1
}
fun1 $1
调用函数时直接传递参数
#!/bin/bashfun1 () {
rm -rf $1
}
fun1 /root/a.txt
(9!)阶乘
5.return返回值
函数返回值:
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为取余256同时可以自己自定义返回码,用return
1、return的值范围是0-255
2、遇到return即结束函数不会再往下执行
6. 本地变量与全局变量
在脚本里定义的变量或者在函数体没有声明为本地变量的都为全局变量,意思是在当前shell环境都识别
如果需要这个变量只在函数中使用则可以在函数中用local关键字声明,这样即使函数体外有个重名的变量也没关系,不影响在函数体的使用
如果是用source执行脚本的话就能看出差别
在函数体中用local定义变量a的值
可以看成变量a的值在函数体设为了本地变量所以只在函数体中生效
7. 函数的递归
递归函数是一个函数在其定义中调用自身。这种方法可以用于解决分解成更小、相似的子问题的问题
函数自己调用自己的本身
列出目录内文件列表,目录用蓝色表示,文件显示层级关系
六、数组的定义
1.什么是数组
数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用
2.数组的分类
普通数组:不需要声明直接定义,下标索引只能是整数
关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串
3.数组的定义方式
第一种:直接把要加入数组的元素用小括号括起来,中间用空格分开
num=(11 22 33 44)
${#num} 显示字符串长度
数组名= (value0 value1 value2)
第二种:精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
num=([0]=55 [1]=66 [2]=77 [4]=88)数组名=([0]=value [1] =value [2] =value...)
第三种:先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
list=“11 12 13 14”
num=($list)方法三:
列表名="value0 value1 value2....”
数组名=($列表名)
第四种:根据下标定义
数组名[0]=“11”
数组名[0]=“22”
数组名[0]=“33”数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
4.数组包括的数据类型
数值类型
字符类型:使用“ ” 或 ‘ ’ 定义
4.1数组元素遍历
4.2元素切片
4.3数组(元素)替换
4.4数组删除
5.数组排序算法
数组排序算法:冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
基本思想:
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。
算法思路:
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少
七、拓展
sh [参数] 文件名.sh
-n 不要执行script,仅查询语法
-v 在执行script之前,先将script的内容输出到屏幕上
-x 将使用的脚本的内容输出到屏幕,该参数经常被使用
-c “string” 从strings中读取命令