目录
一、循环语句
1.1 for循环
解决问题:
- 在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的 对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态
- 当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代 码更是显得异常烦琐、困难重重
语法结构:
- 列表循环
- 不带列表循环
- 类C风格的for循环
①列表循环
for 变量名 in {对变量赋值的值或命令}
do
命令过程
done
②不带列表循环(不带列表循环执行时由用户指定参数和参数的个数决定的)
for 变量名
do
命令过程
done
③类C风格的for循环
for ((expr1;expr2;expr3))
do
命令过程
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出补充:
类C风格运算符用法
++ 自身变量+1
-- 自身变量-1
+=5 自身变量+5
-=5 自身变量-5
*=5 自身变量*5
/=5 自身变量/5
%=5 自身变量%5
列表循环:
例一:
例二:
不带列表循环
例一:
类C风格的for循环
例一:
1.2 while循环
1、语法结构
2、死循环
1.2.1 语法结构(三种)
while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
while 表达式
do
command(命令)
done
示例一:
1.2.2 死循环
while [ 1 -eq 1 ] //写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环
示例一:
1.3 untli循环
与while相反,条件为假进入循环,条件为真退出循环
1.3.1语法结构
until 表达式
do
dommand(命令)
done
示例一:
1.3.2 死循环结构
until false
do
command(命令)
done
示例一:
1.4 补充:循环控制语句
1.4.1 continue
继续,但不会执行循环体内下面的代码,开始重新开始下一次循环
实例一:打印1-5的数字,3不打印
1.4.2 break
打断,马上停止本次循环,执行循环体以外的代码
实例一:1-10的数字,7后面的都不打印
1.4.3 exit
直接跳出程序,后面可跟状态返回码如exit 1等)
实例一:
二、shell函数
2.1 定义函数形式(两种方式)
第一种:
function 函数名 {
command
} //这是一种规范写法
第二种:
函数名(){ //最常用因为最简洁
command
}
补充说明:
- 函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用
- 定义的时候哪怕出现语法错误也没关系,不调用就不会报错
- 当然我们写函数最终目的还是为了调用,为了实现某个功能块
函数返回值:
return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为取余256
例:444 % 256
2.2 函数的调用
直接在脚本里定义函数的代码块后写函数名即可完成调用
注:
①函数名必须是唯一,如果先定义了一个,再用同样的名称定义,第二个会覆盖第一个的功能,出现了你不想要的结果,所以这里一定要注意不要重名!
②调用函数之前必须先进行定义!
③不一定要在脚本开头就定义函数,只要调用之前定义就可以
④如果是在其他地方嵌套调用等情况,不可以直接写函数的值,避免无法识别,可以用反撇号引起来,相当于是调用函数的结果
实例:
2.3 函数的作用范围
shell脚本中变量默认全局有效
local命令:将变量限定在函数内部使用
本地变量与全局变量:
- 在脚本里定义的变量或者在函数体没有声明为本地变量的都为全局变量,意思是在当前shell环境都识别
- 如果需要这个变量只在函数中使用则可以在函数中用local关键字声明,这样即使函数体外有个重名的变量也没关系,不影响在函数体的使用
2.4 函数的参数
实例:阶乘
三、shell数组
3.1 数组的定义
数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用
3.2 数组的分类
普通数组:不需要声明直接定义,下标索引只能是整数
关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串
3.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)
第四种 根据下标定义
数组名[0]=“11”
数组名[0]=“22”
数组名[0]=“33”数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
3.4 数组的数据类型
数值类型
字符类型:使用”“或''定义
3.4.1 数组简单格式
3.4.2 元素遍历
3.4.3 元素切片
3.4.4 元素替换和删除
替换
要实现改变原有数组,可通过重新赋值实现
arr=${arr[@]/3/55} arr=(${arr[@]/3/55})
echo ${arr[@]}
删除
3.4.5 冒泡排序
冒泡排序的基本思想
对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置)。
算法思路
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少