3 - Shell编程之循环语句与函数、数组

目录

一、循环

1.概述

2.循环语句类型

2.1 for 循环 - 用于已知循环次数的场景

2.1.1 格式

2.1.2 示例

2.2  while 循环 - 用于未知循环次数

2.2.1 格式

2.2.2 示例

2.3until 循环 - 通常用于当判断条件不成立时

2.3.1 格式

2.3.2 示例

二、Shell函数

1.概述

2.定义函数

3.调用函数

4.传递参数

5.递归函数

三、数组

1.数组定义方法

2.数组包括的数据类型

3.数组操作

3.1 获取数组长度

3.2 读取某下标赋值

4.冒泡数组

4.1 概述

4.2 数组升序排序示例


一、循环

1.概述

循环(Loop)和遍历(Traversal)是两个在计算机编程中经常使用的概念。

循环:

循环是一种重复执行一段代码的结构。通过循环,可以在满足一定条件的情况下,多次执行相同的代码。

循环语句通常包括一个循环体(Loop Body)和一个循环条件(Loop Condition),当循环条件满足时,循环体会被执行,否则循环结束。

遍历:

遍历是指对一组数据结构中的每个元素进行一次访问的过程。

在计算机编程中,常常需要对数组、列表、树等数据结构中的每个元素进行遍历,以便对它们进行操作或输出。

2.循环语句类型

2.1 for 循环 - 用于已知循环次数的场景

2.1.1 格式

格式:

#格式一(基本格式):

for 变量名 [ in 范围 ]
do
  执行内容
done


#格式二(类C语言格式):

for ((表达式1;表达式2;表达式3))
do
  执行内容
done

死循环(无限循环)语句:

for ((;;))
do
  执行内容
done
2.1.2 示例

数字累加脚本(1-100) 
需求:编写脚本实现计算从1加到100的值

#!/bin/bash
sum=0    #定义变量sum初始值为0
for i in {1..100}    #for循环 i取值从1到100
do
sum=$(($i+$sum))    #循环相加
#let sum=$i+$sum    #每次循环内容计算变量i+sum的值赋值给sum,二选一
done    #for语句结束标志
echo "1-100累加值为:$sum"    #循环结束后输出内容

2.2  while 循环 - 用于未知循环次数

2.2.1 格式

格式:

#基本格式:

while [判断条件]
do
  执行动作
done

死循环(无限循环)语句:

whlie true    #或while [ 1 -eq 1 ] 或 while:
do
  执行内容
done
2.2.2 示例
#!/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脚本
0
1
2
3
4
5    #执行结果

2.3until 循环 - 通常用于当判断条件不成立时

2.3.1 格式
#基本格式:

until  [ 条件测试操作 ]
do
  判断式/命令序列
done
2.3.2 示例
#!/bin/bash
i=0
sum=0
until [ $i -gt 10 ]
do
echo $i
let i++
sum=$(($sum+$i))
done

二、Shell函数

1.概述

  • 函数将命令序列按格式写在一起
  • 方便重复使用命令序列

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

2.定义函数

#格式一:

function name () {
 函数体
}

#格式二:
function name {
 函数体
}

#格式三:
name () {
 函数体
}

#"()"用于存放参数

3.调用函数

#需先定义函数
function name () {
 函数体
}

#调用函数
name

4.传递参数

#!/bin/bash
function name () {
 echo $1    #"$1":位置变量1,执行脚本时输入的第一个参数
 echo $2    #"$2":位置变量2,执行脚本时输入的第二个参数
}

name l1 l2    #"$1"指"l1","$2"指"l2"

....
[root@wzx /]# ./f.sh
l1
l2

5.递归函数

递归函数是指在函数体内调用自身的函数。

#阶乘
#!/bin/bash
fact () {
   if [ $1 -eq 1 ]
   then
       echo 1
   else
       local temp=$[$1 - 1]   
       local result=$(fact $temp)  
       echo "$[$1*$result]"
   fi
}

read -p "请输入阶乘数:" n
result=`fact $n`
echo "$result"

三、数组

1.数组定义方法

#方式一:
数组名=(value0 value1 value2...)

#方式二:
数组名=([0]=value [1]=value [2]=value...)

#方式三:
列表名="value0 value1 value2"
数组名=($列表名)

#方式四:
数组名[0]="value"
数组名[1]="value"
数组名[2]="value"
...

2.数组包括的数据类型

  • 数值类型
  • 字符类型
  • 使用" "或‘ ’定义

3.数组操作

3.1 获取数组长度

[root@wzx /]# abc=(10 20 30)
[root@wzx /]# echo ${abc[*]}
10 20 30
[root@localhost opt]# echo ${#abc[*]}
3    #数组中的元素个数

3.2 读取某下标赋值

[root@wzx /]#arr1=(1 2 3 4 5)
[root@wzx /]#echo ${arr1[0]}      #获取索引为0的元素,即第一个元素
1
[root@wzx /]#echo ${arr1[3]}      #获取索引为3的元素,即第四个元素
4

4.冒泡数组

4.1 概述

冒泡排序

  • 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

基本思想

  • 冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,即交换元素的位置。

算法思路

  • 冒泡算法由双层循环实现。
  • 外部循环用于控制排序轮数,依次将每轮内部循环的最大\小值放入尾部排序。
  • 内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,并将此次最大\小值放入末尾。

4.2 数组升序排序示例

#!/bin/bash
arr=(12 3 325 252 21234 1234 4343 34 5 6453 21342 555 6)
echo ${arr[@]}
len=${#arr[@]}
for ((i=1;i<$len;i++))
do
  for ((k=0;k<$(($len-1));k++))
  do
    l=${arr[$k]}
    r=${arr[$(($k+1))]}
    if [[ $l -gt $r ]]
    then
        temp=$l
        arr[$k]=$r
        arr[$(($k+1))]=$temp
    fi
  done
done
echo "after:"
echo "${arr[@]}"


[root@wzx demo]# ./mp.sh
12 3 325 252 21234 1234 4343 34 5 6453 21342 555 6
after:
3 5 6 12 34 252 325 555 1234 4343 6453 21234 21342

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值