shell编程之循环语句与函数

目录

一、循环语句

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/bash

num1=0
num2=0

for i in {1..100}
do
  if((i % 2 == 0));then
   num1=$(($num1+i))
  else
   num2=$(($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的内容
  then
  echo "$ip$i is online"
  echo $ip$i >> host.txt #将if条件成立的ip追加到host.txt文件中
else
 echo "$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内的命令
done

while  true        直接写判断条件为真
 do                一直执行do内的命令
done

while :         判断条件为冒号也表示死循环
 do             一直执行do内的命令
done

四、until 循环

用法: 重复测试某个条件,只要条件不成立则反复执行,一旦判断条件成立就回终止循环。比如等待某个进程退出、等待某个文件被创建等等

 1.until的语法结构

until  [ 条件测试操作 ]
do
	判断式/命令序列
done

 

 五、函数

1.shell函数

  1. 将命令序列按格式写在一起
  2. 可方便重复使用命令序列

使用函数可以避免代码重复
使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

 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 5

echo ${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 5

arr1[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次。
因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。

内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

 

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值