shell脚本之函数

本文详细介绍了Shell脚本中的函数使用,包括定义、作用范围、参数传递、局部与全局变量以及递归。此外,还探讨了数组的定义、分类和操作,如元素替换、删除及排序算法。内容涵盖函数调用示例、局部变量限制、参数传递演示、数组定义方式及冒泡排序的实现。
摘要由CSDN通过智能技术生成

目录

1、函数

(1)shell函数

 (2)函数的作用范围

 (3)函数的参数

 (4)本地变量与全局变量

 (5)函数的递归

2、数组使用方法

(1)定义

(2)数组的分类

(3)数组的定义方式


1、函数

(1)shell函数

■将命令序列按格式写在一起

■可方便重复使用命令序列

■shell函数定义(使用return或exit可以显示的结束函数)

[ function ] 函数名(){

        命令序列

        [return x]

}

■调用函数的方法

函数名 【参数1】 【参数2】

例子1函数调用

 

 例子2 当函数名重复时 则调用最下方的函数

 

 例子3  函数调用yum本地仓库

例子4:两个数字求乘积,通过sum(){}定义函数,使用read命令交互输入两个数并乘积

 

 (2)函数的作用范围

■函数在shell脚本中仅在当前shell环境中有效

■shell脚本中变量默认全局有效

■将变量限定在函数内部使用local命令

示例

 显示6和9

 

 local是不能在函数外部使用 

 

 (3)函数的参数

■参数的用法

函数名称、参数1、参数2、参数3 ..........

■参数的表示方法

●$! $2 $3 ......${10} ${11} .....

示例

简单传参

 

 阶乘

 

 (4)本地变量与全局变量

在脚本里定义的变量或者在函数里没有声明为本地变量的窦唯全局变量,意思是在当前shell环境都是别如果需要这个变量只在函数中使用则可以在函数中用local关键字声明,这样即使函数体外有个重名的变量也没有关系,不影响在函数体的使用

如果是用source执行脚本的话就能看出差别

[root@localhost ~]# a=nihao
#!/bin/bash            //写一个函数,首先打印a的值,然后改变a的值再打印

f1 (){

echo $a

a=world

echo $aI

f1

[root@localhost ~]# source f1.sh            //用source执行脚本,会发现a的值改变了

nihao

world

[root@localhost ~]# echo $a
world

 计算和

 

 (5)函数的递归

函数自己调用自己的本身

#!/bin/bash
set -x

fa (){

if [ $1 -eq 1 ];then                       当值为1时成立则输出1

echo 1

else

local tp=$[ $1 - 1 ]                       不成立时则进行判断并每一次减一,知道减到与之相同

local res=#(fa $tp)                        这里是附一个函数值与判断后变量值

echo $[ $1 * $res ]                        

fi
}

read -p "请输入值:" num
res=$(fa num)
echo res

2、数组使用方法

(1)定义

数组的存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用

(2)数组的分类

普通数组:不需要声明直接定义,下标索引只能是整数

关联数组:需要用declare -A声明否则系统不识别,索引可以是字符串

(3)数组的定义方式

(30 20 10 60 50 40)

    0    1   2   3  4    5

第一种:直接把要加入数组的元素用小括号括起来,中间空格分开

num=(11 22 33 44)

${#num}显示字符串长度

数组名=(value0 value1 value2)

第二种:直接把要加入数组的元素用小括号括起来,中间用空格分开

num=([0]=55 [1]=66 [2]=77 [4]=88)

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

第三种:先把要记入数组的元素全部先赋值给一个变量,然后引用这个变量加入到数组

list=“11 12 13 14”

num=($list)

数组(元素)替换

arr=(1 2 3 4 5)

echo ${arr[@]/3/55}                    //${数组名[@或*]/查找字符/替换字符}

echo ${arr[@]}                     //并不会替换数组原有内容

arr=(${arr[@]/3/55})              //要实现改变原有数组,可通过重新赋值实现

arr-${arr[@]/3/55}

arr=(${arr[@]/3/55})

echo ${arr[@]}

arr=(5 1 2 3 4 5)定义下标修改
数组删除

arr=( 1 2 3 45)

unset arr                         //删除数组

echo ${arr[*]}

arr=(1 2 3 4 5)

unset arr [ 4]                    //删除第四个元素

echo ${arr[*]}

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

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

算法思路
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少。

 

排序score= (72 63 85 99 42)
----------------第一轮----------------
72 63 85 99 42              第一次对比数组长度-1 第一轮比较后,最后一位最大值99

63 72 85 99 42              第二次对比

63 72 85 99 42              第三次对比63 728542 99第四次对比

---------------第二轮----------------
63 72 85 42 |99             第一次对比数组长度-2第二轮比较后,最后一位最大值85

63 72 85 42 99              第二次对比

63 72 8542 99               第三次对比63 724285 99

--------------第三轮------------------
63 72 42 |85 99             第一次对比组长度-3第三轮比较后,最后一位最大值72

63 72 42 |85 99             第二次对比

63 42 72 |85 99

--------------第四轮-------------------
63 42 | 72 85 99            第一次对比组长度-4第四轮比较后,最后一位最大值63

42 63 7285 99
# !/bin/bash

#定义变里

ar=(90 70 60 40 5e 20)

echo "old_ar:$(ar[*]

lt=$(#ar[*1)

#定义比较轮数,比较轮数为数组长度-1:从1开始

for ((i=1;i<$lt;i++))

do

            #确定比较元素的位置,比较相邻两个元素,较大的数往后放,比较次数随比较轮数而减少
            
            for(j-0;j<lt;j++))
            
            do
            
            #定义第二个元素的值

            k=$[$j+1]
  
            scond=${ar[$k]}

            #如果第一个元素比第二个元素大就互换

            if [ $first -gt $scond ]
   
            then

            #把第一个元素值保存带临时的变量中

            temp=$frist

            #把第二个元素的值赋给第一个元素

            ar[$j]=$scond

            #把临时变量赋给第二个元素

            ar[$k]=$temp

            fi

            done
done
echo "new_ar:${ar[*]}"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值