目录
一、for循环
1、语法结构
for 变量名 in 取值列表
do
命令序列
done
for 变量名 in 取值列表
do
for 变量名 in 取值列表
do
命令序列
done
done
2、概念
单循环——for循环就是把一个步骤一直重复执行的操作。如果没有终止条件,那么这一步骤就会一直执行下去,直到为止。书本上对循环的定义是:用来控制语句块重复执行的一种结构
双循环——也可以理解为内外循环,就是取第一个外循环参数执行后,进入内循环,一直把内循环一直操作,直到为止,在跳出内循环,执行外循环的第二个参数,再次进入内循环,进行操作,直到为止,以此方式一直执行下去,直到外循和内循环结束,执行的次数可以简单理解为n*n次。
3、实例
二、while循环
1、语法结构
while 条件测试操作
do
命令序列
done
2、概念
重复测试某个条件,只要条件成立则反复执行
首先判断while后的条件测试操作结果,如果条件成立,则再次测试,直到结果不成立为止
3、实例
三、until 语句
1、语句结构
until 条件测试操作
do
命令序列
done
2、概念
重复测试某个条件,只要条件不成立则反复执行
首先判断until后的条件测试操作结果,如果不条件成立,则再次测试,直到结果成立为止
3、实例
四、函数
1、语法结构
function 函数名 {
命令序列
}
或者
函数名 () {
命令序列
}
2、概念
函数定义完之后并不会自动执行,需要调用才行,好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
当然我们写函数最终目的还是为了调用,为了实现某个功能块
3、sh和set使用
set -x:显示运行过程
set +x:不显示运行过程
sh 参数 脚本名字
-n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
-v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示。
-x:将执行的脚本内容输出到屏幕上,这个是对调试很有用的参数。 当脚本文件较长时,可以使用 set 命令指定调试一段脚本
4、实例
其实我们只是想echo出fa5
fa5=5*fa4
fa4=4*fa3
fa3=3*fa2
fa2=2*fa1
fa1=1
五、数组应用
1、应用场景
获取数组长度、获取元素长度、遍历元素、元素切片、元素替换、元素删除
2、定义
数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用
数组的分类
普通数组:不需要声明直接定义,下标索引只能是整数
关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串
定义方式
数组 ( 10 5 8 3 )
位置 0 1 2 3
第一种:直接把要加入数组的元素用小括号括起来,中间用空格分开
num=(11 22 33 44)
${ #num}显示宁符串长度
数组名=(valueo value1 value2)
第二种:精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续
num=([0]=55 [1]=66 [2]=77 [4]=88)
数组名=( [0]=value [1]=value [2]=value. . .)
第三种:先把要加入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组
list=“11 12 13 14”
num=($list)
\列表名=valueo valuel value2. ..."
数组名=($列表名)
第四种根据下标定义
数组名[0]=”11"
数组名[0]="22"
数组名[0]="33"
数组名[0]="value"
数组名[1]="value"
数组名[2]="value""
3、参数功能
[root@localhost ~]# an=(10 20 15) #定义数组
[root@localhost ~]# an_lg=${an[*]}
[root@localhost ~]# echo $an_lg #输出数的整体
10 20 15
[root@localhost ~]# an_lg=${an[@]}
[root@localhost ~]# echo $an_lg #输出每个位置对应的数
10 20 15
[root@localhost ~]# an_lg=${#an[@]}
[root@localhost ~]# echo $an_lg #输出一共多少个数
3
[root@localhost ~]# an_lg=${an[2]}
[root@localhost ~]# echo $an_lg #输出对应2位置上的数
15
[root@localhost ~]# echo ${an[*]:2:1} #从第二个位置开始切,一个字符
15
[root@localhost ~]# arr=(1 2 3 4 5 6 7)
[root@localhost ~]# echo ${arr[*]/4/70} #把4替换成70
1 2 3 70 5 6 7
[root@localhost ~]# echo ${arr[*]/6/70}
1 2 3 4 5 70 7
[root@localhost ~]# unset arr[5]
[root@localhost ~]# echo ${arr[*]} #输出对应5上面的字符
1 2 3 4 5 7
4、冒泡升降排序
#!/bin/bash
arr=(30 10 50 60 40 20)
echo "原数组的顺序为:${arr[*]} "
#获取数组的长度
length=${#arr[*]}
#冒泡排序:
#定义比较轮数,为数组长度减一,并且要从1开始
for ((i=1; i<$length; i++))
do
#确定每次比较的元素下标,比较相邻2个元素,大的往后放,小的往前放,并且每轮比较的次数要随着轮>
数递减for ((j=0;j<$length-$i; j++))
do
#获取第一个元素的值
first=${arr[$j]}
#获取第二个元素的值
k=$[$j+1]
second=${arr[$k]}
#比较第一个元素和第二个元素的值,如果第一个元素值大于第二个元素值则两个元素位置交换
if [ $first -gt $second ];then
#先把第一个元素的值保存在临时变量temp中
temp=${arr[$j]}
#把第二个元素的值赋给第一个元素
arr[$j]=$second
#把原来第一个元素的值赋给第二个元素
arr[$k]=$temp
fi
done
done
echo "排序后新的数组的顺序为:${arr[*]}"