Shell脚本五:函数和数组

文章目录

  • 1.函数
    • 1.1Shell函数的概念
    • 1.2函数的好处
    • 1.2函数的组成
    • 1.3函数的结构
    • 1.4查看函数列表
    • 1.5删除函数
    • 1.6函数的返回值
      • 1.6.1使用原则
      • 1.6.2示例
    • 1.7函数的作用范围
    • 1.8函数递归
      • 1.8.1示例
  • 2.数组
    • 2.1什么是数组
    • 2.2数组的作用
    • 2.3数组名和索引
    • 2.4定义数组的方式
    • 2.5普通数组和关联数组
      • 2.5.1普通数组
      • 2.5.2关联数组
    • 2.6引用数组中的值
      • 2.6.1数组包括的数据类型
      • 2.6.2 获取数值长度
      • 2.6.3 获取数值列表
      • 2.6.4 读取某个下标赋值
    • 2.7数组脚本内相关操作
      • 2.7.1 数组遍历
      • 2.7.2数据切片
      • 2.7.3数组替换
      • 2.7.4 删除数组
    • 2.8 冒泡排序
      • 2.8.1什么是冒泡排序
      • 2.8.2 基本思想
      • 2.8.3 算法思路
      • 2.8.4 示例
    • 2.9 数组示例

1.函数

1.1Shell函数的概念

函数的数学表达式sin、cos、tan 其实只是定义好的计算公式,函数就是一个功能模块,在函数中写好需要执行的命令即可

1.2函数的好处

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

1.2函数的组成

函数名和函数体

1.3函数的结构

【1】
function 函数名 {
	命令序列
}

【2】
函数名() {
	命令序列
}

【3】
function 函数名 (){
	命令序列
}
示例:
[root@localhost ~]#name () { hostname;}
#定义函数
[root@localhost ~]#name  #输出函数
localhost.localdomain

在这里插入图片描述
注意事项

  1. 直接写 函数中调用函数 直接写函数名

  2. 同名函数 后一个生效

  3. 调用函数一定要先定义

  4. 只要先定义了调用的 其他函数定义顺序无关

1.4查看函数列表

declare -F
#查看当前已定义的函数名
declare -f
#查看当前已定义的函数定义
declare -f func_name 
#查看指定当前已定义的函数名
declare -F func_name
#查看当前已定义的函数名定义

1.5删除函数

unset 函数名
#删除函数

在这里插入图片描述

1.6函数的返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值

1.6.1使用原则

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码
  2. 退出码必须是0-255,超出的值将为除以256取余

1.6.2示例

#!/bin/bash
test1 () {
        read -p "请输入一个数字:" num
        return $[$num*2]

}

test1
echo $?

在这里插入图片描述

1.7函数的作用范围

函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
Shell脚本五:函数和数组_第1张图片
将变量限定在函数内部使用local命令
Shell脚本五:函数和数组_第2张图片

1.8函数递归

函数调用自己本身的函数

1.8.1示例

阶乘

#定义函数
fach () {
if [ $1 -eq 0 -o $1 -eq 1 ]
then
echo 1
else
#调用函数
echo $[$1*$[(fach $[$1-1])]
fi
}
fach $1

在这里插入图片描述

2.数组

2.1什么是数组

数组是一种数据结构,用于存储一组相同类型的元素。

数组是一个连续的内存区域,元素在内存中按照顺序存储,每个元素可以通过索引访问,索引从0开始,逐个递增。

2.2数组的作用

数组可以存储各种类型的数据,例如整数、浮点数、字符、字符串等。

数组常用于存储和处理大量数据,提供了便捷的方式来访问和操作这些数据。

2.3数组名和索引

-索引的编号从0开始,属于数值索引
-索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引
-bash的数组支持稀疏格式(索引不连续)

2.4定义数组的方式

方式一:一次性赋值全部

数组名=(valueo0 value1 value2....

在这里插入图片描述
方式二:通过下标赋值

数组名=[0]=value [1]=value [2]=value...)

在这里插入图片描述
方式三:先创建列表,再赋值

列表名=“value0 value1 value2.. ”
数组名=($列表名)

Shell脚本五:函数和数组_第3张图片
方式四:一个一个赋值

数组名[0]="value0"
数组名[1]="value1"
数组名[2]="value2"

Shell脚本五:函数和数组_第4张图片
方式五:交互型

read -a 数组名
#自行赋值

在这里插入图片描述

下标值和索引值表示相同的意思,即元素在数组中的位置
数组的下标值从0开始,逐个递增,用于唯一标识数组中的每个元素

2.5普通数组和关联数组

2.5.1普通数组

  • 使用连续的整数值作为索引,从0开始递增
  • 声明时使用 declare 或 declare -a 命令
  • 元素之间的顺序是固定的,根据索引进行访问

示例

xinshi=("liu" "guan" "zhang")
echo ${xinshi[1]} #输出guan
echo ${xinshi[2]} #输出zhang

普通数组使用整数索引访问数组中的元素。

2.5.2关联数组

使用任意字符串作为键来访问和存储元素
声明时使用 declare -A 命令
元素之间的顺序是不固定的,通过键进行访问

示例

declare -A nianlin
nianlin["liu"]=30
nianlin["guan"]=45

echo ${nianlin[liu]}      #输出30
echo ${nianlin[guan]}  #输出45

关联数组使用字符串进行访问数组中的元素。

2.6引用数组中的值

2.6.1数组包括的数据类型

  • 数值类型
  • 字符类型

使用 " " 或 ’ ’ 定义

2.6.2 获取数值长度

echo ${#数组名 [*]}
echo ${#数组名[@]}

Shell脚本五:函数和数组_第5张图片

2.6.3 获取数值列表

echo ${数组名 [*]}
echo ${数组名[@]}

在这里插入图片描述

2.6.4 读取某个下标赋值

自定义名=${数组名[下标号]}

Shell脚本五:函数和数组_第6张图片

2.7数组脚本内相关操作

2.7.1 数组遍历

数组遍历是指按顺序访问数组中的每个元素。

#!/bin/bash
a=(1 2 3 4 5 6) #定义数组

for i in ${a[@]} #将数组内赋值定义循环变量
do
echo $i #输出变量
done

Shell脚本五:函数和数组_第7张图片

2.7.2数据切片

挑选数组中某一段进行输出

#!/bin/bash
a=(1 2 3 4 5 6)
#定义数组
echo ${a[@]:1:3}
#获取 ${数组名[@或*]:起始位置:长度} 的值

在这里插入图片描述

2.7.3数组替换

用当前所需数据替换原有数据
只是临时替换

#!/bin/bash
a=(1 2 3 4 5 6)
#定义源数组
echo ${a[*]/5/55}
#${数组名[@或*]/查找字符/替换字符}
echo ${a[*]}
#查看是不是永久替换

Shell脚本五:函数和数组_第8张图片

2.7.4 删除数组

整个删除

unset 数组名

Shell脚本五:函数和数组_第9张图片
选择删除

unset 数组名[下标号]

Shell脚本五:函数和数组_第10张图片

2.8 冒泡排序

2.8.1什么是冒泡排序

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

2.8.2 基本思想

冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,
把较小的元素移动到数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),
这样较小的元素就像气泡一样从底部上升到顶部。

2.8.3 算法思路

冒泡算法由双层循环实现
外部循环

用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。

内部循环

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

2.8.4 示例

升序排序

#!/bin/bash
a=(10 1 20 30 99 11)    #定义数组
l=${#a[*]}              
#定义比较轮数 比较轮数为数组长度减1,从1开始 
for ((i=1;i<$l;i++))
do
        for ((j=0;j<$l-1;j++))#确定比较元素的位置,比较相邻两个元素,较大的数往后放,比较次数随比较轮数而减少
        do
        first=${a[$j]} #定义第一个元素的值
        k=$[$j+1]      #定义第二个元素的值
        second=${a[$k]}

        if [ $first -gt $second ] #如果第一个元素比第二个元素大就互换
        #如果小于就为降序
        then
        temp=$first
        a[$j]=$second
        a[$k]=$temp
        #把临时变量(也就是第一个元素原值)赋给第二个元素
        fi
        done
done
echo ${a[@]}
#输出排序后的数组

在这里插入图片描述

2.9 数组示例

取出最大值

#!/bin/bash
a=(10 1 20 30 99 101) #定义数组
 
max=${a[0]}
l=${a[*]}
for ((i=0;i<$l;i++))
do
    if [[ $max -lt ${a[$i+1]} ]]
    then
    max=${a[$i+1]}
    fi
done
echo $max

在这里插入图片描述

取出最小值

#!/bin/bash
read -p "请输入数字与" num
a=($num)
min=${a[0]}

for ((i=0;i<${#a[*]}-1;i++))
do
       if [[ $min -ge ${a[$i+1]} ]]
       then
       echo
       min=${a[$i=1]}
       fi
done
echo "数组中最小的是:" $min

在这里插入图片描述

你可能感兴趣的:(linux)