目录
一、循环语句
1.for循环
1.1for语句结构
1.2 for循环语法
2.seq
3.常用转义字符
二、跳出循环
1.continue 跳出循环
2.break 跳出循环
三、while 循环
1.while的语法结构
2.死循环语句
四、until 循环
1.until的语法结构
五、函数
1.shell函数
2.shell函数基本用法
3.函数返回值
4.示例:
5.函数传参
6.递归
6.1 阶乘
六、数组
1.数组的概念
2.数组定义方法
3.获取数组长度
4.读取某下标赋值
5.数组遍历
6.数组切片
7.数组替换
8.删除数组
七、数据排列算法——冒泡排序
一、循环语句
1.for循环
for循环,又有人称之为条件循环,或者for i in ,其实就是for循环的特性,次数和给与的条件是成正比的。
1.1for语句结构
读取不同的变量值,用来逐个执行同一命令
for 变量名(注意是名称不是变量$等) [ in 名称范围 ]
do 执行内容(若满足循环则作什么动作)
done #for循环结束标志
求从1到100所有整数的偶数和、奇数和
#!/bin/bashnum1=0
num2=0for i in {1..100}
doif((i % 2 == 0));thennum1=$(($num1+i))elsenum2=$(($num2+i))fi
done
echo "1到100中所有的偶数和为:$num1"
echo "1到100中所有的奇数和为:$num2"
1.2 for循环语法
for循环用于已知循环次数的场景 for((;;))#死循环
for 变量名称(注意是名称不是变量$等) [ in 名称范围 ] (可以不写)
do
执行内容 若满足循环则做什么动作
done for循环结束标志
类C语言格式
for (( 表达式1 ;表达式2;表达式3 ))do
执行内容 若满足循环则做什么动作
done for循环结束标志
表达式1:定义变量并赋值
表达式2:决定是否循环表达式3:决定循环变量如何改变,决定循环什么时候结束
2.seq
seq 是一个 Linux/Unix 命令,用于生成一个序列(sequence)并打印出来。
3.常用转义字符
echo -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上 echo -ne
常用的转义字符如下:
\b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。
\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
\n 换行,被输出的字符从"\n"处开始另起一行。
\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;
\v 与\f相同;
\t 转以后表示插入tab,即横向制表符;
\r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
\\ 表示插入"\"本身
二、跳出循环
1.continue 跳出循环
表示满足continue条件时跳出循环,但是不影响后续循环执行,它的作用是在循环内部跳过本次循环并继续下一次循环
continue 2 是一个 Shell 中的控制结构,它的作用是在循环内部跳过本次循环并继续下一次循环,而且会跳过两层循环,即在两层循环内部执行。
在嵌套循环中,如果我们使用 continue 2 命令,
它将跳过包含它的内层循环和外层循环的迭代,并继续执行下一次外层循环的迭代。
2.break 跳出循环
在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。
break [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,
若为3则结束自己所在循环和外边嵌套的2层循环
break 命令并不控制循环次数,它是用于控制循环流程的。
当 break 命令执行时,它会立即跳出当前的循环并继续执行循环后面的代码。
例题:循环ping测试某个网段网络连通性
循环ping测试某个网段网络连通性
需求:测试用户输入的某个32位网段是否可以ping通,且若可以ping通将此ip输出到文件host.txt中。思路:
①第一步读取用户输入的32位网段。
②使用for循环生成用户输入网段的所有ip。
③使用ping命令在循环中测试用户输入网段内所有ip,注意指定ping包个数和超时结束时间,否则一直ping。
④将循环检查网络连通性放入后台执行。vim ping.sh
#!/bin/bash
read -p "请输入需要测试的网段,格式为(192.168.233.):" #读取用户输入内容为变量ip
for i in {1..254}
do
{
ping -c 2 -W 2 $ip$i &>/dev/null
#指定ping包为2个超时结束时间为2秒且将产生的内容全部放入null垃圾桶中,&符号表示错误输出也放入null中if [ $? -eq 0 ] #if条件判断如果上一个循环执行的命令是正确的则$?返回0,若等于0执行then的内容thenecho "$ip$i is online"echo $ip$i >> host.txt #将if条件成立的ip追加到host.txt文件中
elseecho "$ip$i is offline" #if添加判断不成立执行打印fi
}& #将循环成立的内容放入后台执行
done
wait #执行结束不等待直接退出ps:不加{}&执行速度非常慢,而且要结束255次才能退出,加了之后相当于并行执行,提升了执行速度
三、while 循环
while循环满足条件执行,不满足不执行。while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
1.while的语法结构
先定义一个变量
while [ 判断条件 ]
do执行动作 #while循环执行动作
done #while循环结束标志
示例:
#!/bin/bash
i=0
while [ $i -le 5 ] #变量i小于等于5时执行while循环
do
echo "$i" #循环执行内容,每循环一次打印$i
let i++ #每循环一次计算一次i++即i自己+1
done #while语句结束标志
sh b.sh #调用bash执行b.sh脚本
2.死循环语句
while [1 -eq 1] 判断条件写一个永久为真的条件 do 一直执行do内的命令
donewhile true 直接写判断条件为真do 一直执行do内的命令
donewhile : 判断条件为冒号也表示死循环do 一直执行do内的命令
done
四、until 循环
用法: 重复测试某个条件,只要条件不成立则反复执行,一旦判断条件成立就回终止循环。比如等待某个进程退出、等待某个文件被创建等等
1.until的语法结构
until [ 条件测试操作 ]
do判断式/命令序列
done
五、函数
1.shell函数
- 将命令序列按格式写在一起
- 可方便重复使用命令序列
使用函数可以避免代码重复
使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强
2.shell函数基本用法
方式一:
function 函数名 {命令序列
}方式二: #也可以省略掉[function],它表示该函数的功能
函数名 (){ #函数名后面()是没有内容的命令序列 #我们执行的命令内容放在{}里面
}
3.函数返回值
return 表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
- 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
- 退出状态码必须是0~255,超出时值将为256取余
4.示例:
另外一种格式:
5.函数传参
用法:参数名称、参数1、参数2...
参数的表示方法:$0 $1 $2....{$10} {$11}...
6.递归
6.1 阶乘
函数调用自己本身的函数
六、数组
1.数组的概念
数组是一种数据结构,用于存储一组相同类型的元素。
数组是一个连续的内存区域,元素在内存中按照顺序存储,每个元素可以通过索引访问,索引从0开始,逐个递增。
- 数组可以存储各种类型的数据,例如整数、浮点数、字符、字符串等。
- 数组常用于存储和处理大量数据,提供了便捷的方式来访问和操作这些数据。
如果数组中有三个参数:1 2 3
运行数组脚本后
"$*" 为 “1 2 3” (作为一个整体使用) $* 显示为一个组
"$@" 为“1” “2” “3” (分别作为单个的个体使用) $@ 内容分别成为一个个体
"$#" 为3 (表示参数的数量,也可以叫做长度) $# 参数数量 也称为长度
2.数组定义方法
方法一:
数组名=(value0 valuel value2 …)
举例:
arr=(1 2 3 4 5)echo ${arr[*]}
1 2 3 4 5
方法二:
数组名=( [0]=value [1]=value [2]=value …)
举例:
arr=([0]=1 [1]=2 [2]=3)echo ${arr1[*]}
1 2 3
方法三:
列表名=“value0 valuel value2 …”
数组名=($列表名)举例:
list="1 2 3 4"
arr2=($list)echo ${arr2[*]}
1 2 3 4
方法四:
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”举例:
arr3[0]="1"
arr3[1]="2"
arr3[2]="3"echo ${arr3[*]}
1 2 3
3.获取数组长度
arr1=(1 2 3 4 5)echo ${#arr1[*]} 就是数组中总共多少个元素
5
4.读取某下标赋值
arr1=(1 2 3 4 5)
echo ${arr1[0]} #获取索引为0的元素,即第一个元素
1
echo ${arr1[3]} #获取索引为3的元素,即第四个元素
4
5.数组遍历
6.数组切片
取数组中的某一段的元素值
格式:${数组名[@或*]} : 起始位置(起始索引) : 长度
arr1=(1 2 3 4 5)
echo ${arr1[*]} #输出整个数组
1 2 3 4 5echo ${arr1[*]:0:2} #这里是从0索引开始获得往后两位元素的值
1 2
echo ${arr1[*]:2:2} #获取从索引2开始往后的两位元素的值
3 4
7.数组替换
临时替换或永久替换
格式: $ { 数组名 [@或*] / 查找字符 / 替换字符 }
arr1=(1 2 3 4 5)
echo ${arr1[*]/4/66} #将数组arr1中的元素4替换为66,这只是临时替换,并不是永久替换
1 2 3 66 5
echo ${arr1[*]} #原来的数组中的元素的值并不会改变
1 2 3 4 5 arr1=(${arr1[*]/4/66}) #如果想要永久替换的话,可通过重新赋值实现
echo ${arr1[*]}
1 2 3 66 5arr1[3]=44 #第四个位置
echo ${arr1[*]}
1 2 3 44 5 6
8.删除数组
使用unset删除数组
删除数组中的某个索引对应的元素的值arr1=(1 2 3 4 5)
echo ${arr1[*]}
1 2 3 4 5
unset arr1[2] #删除索引2的对应的元素值
echo ${arr1[*]}
1 2 4 5
七、数据排列算法——冒泡排序
冒泡排序
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。
基本思想
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,即交换元素的位置。
算法思路
冒泡算法由双层循环实现。
外部循环用于控制排序轮数,循环次数一般为要排序的数组长度减1次。
因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。
内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。