当前位置:   article > 正文

函数与数组

函数与数组

一、函数

1、函数的概念

定义:将命令序列按照格式写在一起。

作用:方便重复使用。

函数库,集中在一起,随时可以传参使用,大的工程分割成若干个小的功能模块,提供代码的可读性

函数格式:

第一种

function 定义的方法名{

命令序列

}

第二种

定义的方法名(){ 命令序列 }定义名(调用传参)

2、返回码

  1. function abc {
  2. num=$(($a*2))
  3. return $num
  4. }
  5. a=10
  6. abc
  7. echo $?
  8. #这里的$?不在具有判断执行结果,只是一个函数内部的返回值

return只能写在函数内部

目的:从函数的内部获取一个返回值,用来判断是否继续执行下一个脚本

在使用return传返回码的时候,默认0是成功,非0都是失败,返回码的值0-255之间,超过了会除256取余数,可以自定义

  1. function abc {
  2. read -p "数" a
  3. if [[ $a -eq $a ]] &> /dev/null
  4. then
  5. num=$(($a*2))
  6. return 0
  7. else
  8. echo "输入错误"
  9. return 1
  10. fi
  11. }
  12. abc
  13. if [[ $? -eq 0 ]]
  14. then
  15. echo ok
  16. else
  17. echo no
  18. fi

3、 函数的传参方式已经函数变量的作用范围

1、传参方式

  1. 定义值
  2. abc () {
  3. num=$(($a+$b))
  4. echo $num
  5. }
  6. read -p "第一个" a
  7. read -p "第二个" b
  8. abc
  9. ~
  10. 第二种方式
  11. abc () {
  12. num=$(($1+$2))
  13. echo $num
  14. }
  15. abc $1 $2

2、函数变量的作用范围

  1. abc () {
  2. a=4
  3. b=4
  4. }
  5. a=2
  6. b=9
  7. abc
  8. ehco $a
  9. echo $b
  10. 在函数内部定义了全局变量,
  11. 外部的赋值是不能改变内部函数的全局变量的
  12. 输出结果
  13. a=4
  14. b=4
  15. abc () {
  16. local a=4
  17. local b=4
  18. c=10
  19. }
  20. a=2
  21. b=9
  22. c=1
  23. abc
  24. echo $a
  25. echo $b
  26. echo $c
  27. 加了local之后就是函数内部的变量,而不是全局变量,外部的赋值会替换内部的变量值
  28. 输出
  29. a=2
  30. b=9
  31. c=10

函数递归:函数调用自己本身的函数

实例:用函数递归的方式实现阶乘

  1. abc () {
  2. if [[ $1 -eq 1 ]]
  3. then
  4. echo 1
  5. else
  6. local temp=$(($1-1))
  7. local result=$(abc $temp)
  8. echo "$(($1*$result))"
  9. fi
  10. }
  11. read -p "请输入你要计算的数字:" num
  12. result1=`abc $num` #``将运算出来的结果作为一个字符串进行输出
  13. echo $result1

实例:用函数递归的方式实现递归目录到没有文件为止

  1. 递归目录,直到目录里面没有文件为止
  2. jiecheng () {
  3. for file in `ls $1`
  4. do
  5. #-d 测试目录
  6. if [[ -d "$1/$file" ]]
  7. then
  8. echo $file
  9. jiecheng "$1/$file"
  10. else
  11. echo "不是一个目录$file"
  12. fi
  13. done
  14. }
  15. jiecheng $1

4、函数库

函数库中只包含定义的函数,由另外一个脚本传入参数来调用我们定义的函数

实例:小数+整数都可以运算 小数点后两位

函数库文件名hans3.sh

  1. jiafa () {
  2. result=$(echo "$1 + $2" | bc)
  3. #结果保留两位小数
  4. printf "%.2f\n" "$result"
  5. }
  6. jianfa () {
  7. result=$(echo "$1-$2" | bc)
  8. #结果保留两位小数
  9. printf "%.2f\n" "$result"
  10. }
  11. chengfa () {
  12. result=$(echo "$1*$2" | bc)
  13. #结果保留两位小数
  14. printf "%.2f\n" "$result"
  15. }
  16. chufa () {
  17. if [[ $2 -eq 0 ]]
  18. then
  19. echo "除数不能为0"
  20. else
  21. result=$(echo " $1/$2" | bc)
  22. #结果保留两位小数
  23. printf "%.2f\n" "$result"
  24. }

调用函数 文件名diaoyong3.sh

  1. . /opt/hanshu3.sh
  2. read -p "输入第一个数:" num1
  3. read -p "输入第一个数:" num2
  4. sum=`jiafa $num1 $num2`
  5. sub=`jianfa $num1 $num2`
  6. mult=`chengfa $num1 $num2`
  7. div=`chufa $num1 $num2`
  8. echo $sum
  9. echo $sub
  10. echo $mult
  11. echo $div

运行调用函数前需要给函数库赋可执行权限

二、数组

1、数组的概念

数组:在集合当中指定多个元素,元素的类型:整数,字符串,可以是浮点

作用:一次性定义多个元素,可以位变量赋值提供便利

数组的定义方法:

数组名=(元素值) 数组名不能重复

数组名=(a b c d)

打印数组值echo ${数组名[* ]}或者echo ${数组名[@]}

  1. #两种定义的方法
  2. [root@localhost opt]# test1=(a b c d)
  3. [root@localhost opt]# echo ${test1[*]}
  4. a b c d
  5. #[0]中的0表示下标,从0开始
  6. [root@localhost opt]# test[0]=1
  7. [root@localhost opt]# test[1]=2
  8. [root@localhost opt]# test[2]=3
  9. [root@localhost opt]# echo ${test[*]}
  10. 1 2 3

数组的长度指的是数组内包含了几个元素

echo ${#test[*]} 或者echo ${#test[@]}

  1. #test内包含了3个文件
  2. [root@localhost opt]# echo ${#test[*]}
  3. 3

查看数组第几个内容

  1. [root@localhost opt]# test3=(11 22 33)
  2. [root@localhost opt]# echo ${test3[0]}
  3. 11
  4. [root@localhost opt]# echo ${test3[1]}
  5. 22
  6. [root@localhost opt]# echo ${test3[2]}
  7. 33

对数组进行遍历

  1. #对数组进行遍历
  2. test4=(aa bb cc dd)
  3. for i in ${test4[*]}
  4. do
  5. echo $i
  6. done

结果 

  1. [root@localhost opt]# sh shuzu1.sh
  2. aa
  3. bb
  4. cc
  5. dd

对数组进行切片

  1. [root@localhost opt]# test5=(1 2 3 4 5)
  2. #0表示起始位置,2表示步长,起始位置0开始,包括0移动2
  3. [root@localhost opt]# echo ${test5[*]:0:2}
  4. 1 2
  5. [root@localhost opt]# echo ${test5[*]:1:3}
  6. 2 3 4
  7. [root@localhost opt]# echo ${test1[*]}
  8. a b c d
  9. [root@localhost opt]# echo ${test1[*]:1:1}
  10. b
  11. [root@localhost opt]# echo ${test1[*]:1:2}
  12. b c

2、数组替换

临时替换,不会真正改变数组值

  1. [root@localhost opt]# echo ${test5[*]/1/a}
  2. a 2 3 4 5
  3. [root@localhost opt]# echo ${test5[*]}
  4. 1 2 3 4 5

永久修改,通过修改元素下标的值可以实现

  1. [root@localhost opt]# test5[0]=b
  2. [root@localhost opt]# echo ${test5[*]}
  3. b 2 3 4 5
  4. [root@localhost opt]# test5[4]=e
  5. [root@localhost opt]# echo ${test5[*]}
  6. b 2 3 4 e

3、删除数组

删除整个数组

  1. [root@localhost opt]# unset test1
  2. [root@localhost opt]# echo ${test1[*]}
  3. [root@localhost opt]#

 删除数组中的元素,元素下标的值不会发生变化

  1. [root@localhost opt]# unset test5[0]
  2. [root@localhost opt]# echo ${test5[*]}
  3. 2 3 4 e
  4. [root@localhost opt]# echo ${test5[0]}
  5. [root@localhost opt]# echo ${test5[1]}
  6. 2

4、数组中进行追加

  1. #根据元素下标,指定追加
  2. [root@localhost opt]# echo ${test5[*]}
  3. 2 3 4 e
  4. [root@localhost opt]# test5[0]=a
  5. [root@localhost opt]# echo ${test5[*]}
  6. a 2 3 4 e
  7. [root@localhost opt]# test5[6]=9
  8. [root@localhost opt]# echo ${test5[*]}
  9. a 2 3 4 e 9
  10. #自动追加
  11. [root@localhost opt]# test5+=(qq oo)
  12. [root@localhost opt]# echo ${test5[*]}
  13. a 2 3 4 e 9 qq oo
  14. #追加只能在最后开始追加,中间缺失的部分不会补齐
  15. [root@localhost opt]# echo ${test5[*]}
  16. a 2 3 4 e 9 qq oo
  17. [root@localhost opt]# unset test5[4]
  18. [root@localhost opt]# echo ${test5[*]}
  19. a 2 3 4 9 qq oo
  20. [root@localhost opt]# test5+=(ddd)
  21. [root@localhost opt]# echo ${test5[*]}
  22. a 2 3 4 9 qq oo ddd
  23. [root@localhost opt]# echo ${test5[4]}

实例:定义一个数组,元素都是整数,实现数字内整数的累加求和

  1. sum=0
  2. test1=(10 20 30 40 50)
  3. for i in ${test1[*]}
  4. do
  5. sum=$(($sum+$i))
  6. done
  7. echo $sum

 实例:定义一个数组,元素都是整数,分别求出偶数,奇数累加求和

  1. sum1=0
  2. sum2=0
  3. test1=(10 15 40 61 31 42)
  4. for i in ${test1[*]}
  5. do
  6. if [[ $((i%2)) -eq 0 ]]
  7. then
  8. sum1=$(($sum1+$i))
  9. else
  10. sum2=$(($sum2+$i))
  11. fi
  12. done
  13. echo "偶数的和为:$sum1"
  14. echo "奇数的和为:$sum2"
  15. 运行结果
  16. [root@localhost opt]# sh shuzu2.sh
  17. 偶数的和为:92
  18. 奇数的和为:107

实例:定义一个数组,并取出一个最小值,最大值

  1. test1=(3 5 7 4 1)
  2. max=${test1[0]}
  3. min=${test1[0]}
  4. for i in ${test1[*]}
  5. do
  6. if [[ $i -gt $max ]]
  7. then
  8. max=$i
  9. fi
  10. if [[ $i -lt $min ]]
  11. then
  12. min=$i
  13. fi
  14. done
  15. echo "max=$max"
  16. echo "min=$min"

结果

  1. [root@localhost opt]# sh shuzu2.sh
  2. max=7
  3. min=1

5、冒泡排序

冒泡排序类似于气泡上涌的工作,会将数组当中的元素按照从小到大,或者从大到小的顺序进行一个重新排列

从小到大排

思路:对比两个相邻的元素,以从下到大为例,满足交换条件的元素,小的往左移,大的往右移动

数组的位置发生变化(下标对应的元素的值发生变化)

双层循环,外部循环控制排序的轮次,内部循环用来对比两个元素的大小,决定是否互换位置

对比和交换的次数随着排序轮次而减少

实例:使用冒泡排序将test1的内容进行从小到大进行排序

  1. test1=(20 10 60 40 50 30)
  2. len=${#test1[*]}
  3. #定义排序的轮次
  4. for ((i=1;i<$len;i++))
  5. do
  6. for ((k=0;k<$len-i;k++))
  7. do
  8. #定义第一个数组的值
  9. first=${test1[$k]}
  10. j=$(($k+1))
  11. #定义第二个下标位置
  12. second=${test1[$j]}
  13. if [ $first -gt $second ]
  14. then
  15. #交换位置
  16. temp=$first
  17. test1[$k]=$second
  18. test1[$j]=$temp
  19. fi
  20. done
  21. echo "排序后的数组值为:${test1[*]}"
  22. done

 实例:使用冒泡排序将df的已用进行从大到小进行排序

  1. # 取出已用并将%去掉
  2. test1=($(df -h | awk 'NR>1 {print $5}' | tr -d '%'))
  3. len=${#test1[*]}
  4. #定义排序的轮次
  5. for ((i=1;i<$len;i++))
  6. do
  7. for ((k=0;k<$len-i;k++))
  8. do
  9. #定义第一个下标的值
  10. first=${test1[$k]}
  11. j=$(($k+1))
  12. #定义第二个下标位置
  13. second=${test1[$j]}
  14. if [ $first -le $second ]
  15. then
  16. #交换位置
  17. temp=$first
  18. test1[$k]=$second
  19. test1[$j]=$temp
  20. fi
  21. done
  22. done
  23. echo "排序后的数组值为:${test1[*]}"

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/752080
推荐阅读
相关标签
  

闽ICP备14008679号