栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

shell脚本之函数与数组

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

shell脚本之函数与数组

函数与数组
  • 一、函数
    • 1.1 函数概念
    • 1.2 函数的基本格式
    • 1.3 函数的返回值
    • 1.4 函数的作用范围
    • 1.5 函数的用法
      • 1.5.1 函数的参数
      • 1.5.2 函数的常规调用方法
    • 1.6 递归函数
  • 二、数组
    • 2.1数组的含义与作用
    • 2.2 数组的分类
    • 2.3 定义数组的方法
    • 2.4 数组格式
    • 2.5 对数组的相关调整
    • 2.6 数组的一些运用示例
    • 总结:

引言: 学习shell的标准化,模块化

一、函数 1.1 函数概念

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

可方便重复使用命令序列

1.2 函数的基本格式
[function] 函数名(){
  命令序列
[return x]                           #使用return或exit可以显示的结束函数 
}


或者

                                 #也可以省略掉[function],它表示该函数的功能

函数名() {                            #函数名后面()是没有内容的
  命令序列                            #我们执行的命令内容放在{}里面
}

函数定义完之后并不会自动执行,需要调用才行

好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错

当然我们写函数最终目的还是为了调用,为了实现某个功能块。

1.3 函数的返回值

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

函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码

退出状态码必须是0~255,超出时值将为256取余

1.4 函数的作用范围

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

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

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

示例:

[root@localhost hs]# sh 3.sh
6
6
[root@localhost hs]# vim 3.sh
[root@localhost hs]# sh 3.sh
6
8

1.5 函数的用法 1.5.1 函数的参数

参数的用法 :

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

参数的表示方法:

$1 $2 $3 …… ${10} ${11}……

1.5.2 函数的常规调用方法



与顺序无关,只有函数调用才能执行



遇到重名时只执行最后一个,函数调用从上往下执行

1.6 递归函数

调用自己本身的函数


二、数组 2.1数组的含义与作用

含义:
数组中可以存放多个值。

Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

与大部分编程语言类似,数组元素的下标由 0 开始。

2.2 数组的分类

数值类型的数组: 一对括号表示数组,数组中元素之间使用“空格”来隔开。

arr_number=(1 2 3 4 5);、

字符串类型数组: 同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。

arr_string=(“abc” “edf” “sss”); 或者 arr_string=(‘abc’ ‘edf’ ‘sss’);

2.3 定义数组的方法

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

[root@localhost hs]# arr=(1 2 3 4 5 6 7 8 9)
[root@localhost hs]# echo ${arr[*]}
1 2 3 4 5 6 7 8 9

法二:
精确的给每一个下标索引定义一个值加入数组,索引数字可以不连续

[root@localhost hs]# num=([0]=22 [1]=23 [2]=24 [3]=25 [4]=26)
[root@localhost hs]# echo ${#num[@]}
5
[root@localhost hs]# echo ${num[@]}
22 23 24 25 26

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

[root@localhost hs]# list=“11 22 33 44”
[root@localhost hs]# li=($list)
[root@localhost hs]# echo ${li[*]}
11 22 33 44

法四:
可以把命令的结果用小括号括起来添加到数组,那么数组会以空格或者制表符区分每一个元素

[root@localhost hs]# echo “1 2 3 4 5 6”>A.txt
[root@localhost hs]# cat A.txt
1 2 3 4 5 6
[root@localhost hs]# liu=(cat A.txt)
[root@localhost hs]# echo ${liu[@]}
1 2 3 4 5 6

2.4 数组格式

如:
[root@localhost hs]# arr=(1 2 3 4 5 6 7 8 9)
[root@localhost hs]# echo ${#arr[*]}
9
[root@localhost hs]# echo ${arr[2]}
3

数组名称: arr
数组元素: 1 ,2, 3, 4, 5, 6 ,7 ,8 ,9,数组元素默认是以空格分隔的
数组长度: 9 ,有9个元素
数组下标: 每个数组都有一个下标索引,一般从“0”开始,“3”是数组第三个元素 但他的下标索引是“2”

2.5 对数组的相关调整

读取数据和元素

[root@localhost hs]# arr=(1 2 3 4 5  6 7 8 9)   ##定义一个组
[root@localhost hs]# echo ${#arr[*]}      ## 查看元素的个数
9
[root@localhost hs]# echo ${arr[2]}  ##查看索引为2的元素
3
[root@localhost hs]# echo ${arr[@]}   ##列出所有元素
1 2 3 4 5 6 7 8 9
[root@localhost hs]# echo ${!arr[*]}  ##查看所有索引
0 1 2 3 4 5 6 7 8
[root@localhost hs]# declare -a | grep arr    ##查看声明的所有变量可以看到数组
declare -a arr='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6" [6]="7" [7]="8" [8]="9")'
[root@localhost hs]# echo ${arr[*]:2:4}    ##提取索引2开始的4个元素  
3 4 5 6
[root@localhost hs]# arr[0]=77    ##替换元素
[root@localhost hs]# echo ${arr[*]}  
77 2 3 4 5 6 7 8 9
[root@localhost hs]# echo ${arr[*]/3/33}   ##临时替换元素
77 2 33 4 5 6 7 8 9
[root@localhost hs]# unset arr[1]    ###删除索引为1的元素
[root@localhost hs]# echo ${arr[*]} 
77 3 4 5 6 7 8 9
[root@localhost hs]# unset arr   ##删除数组
[root@localhost hs]# echo ${arr[*]}

[root@localhost hs]# 

2.6 数组的一些运用示例

示例
1.
#!/bin/bash
#将1-10数字加入数组
for i in {0…9}
do
arr[$ i]=$[i+1]
done
echo ${arr[*]}


或者

#!/bin/bash
list=seq 10
arr=($list)
echo ${arr[*]}

输出数组中最大的值
#!/bin/bash
arr=(5 10 15 20)
max=${arr[0]} ##先假设第一个元素最大,循环跟他做比较,如果后面有比他大的值就赋值给max,最后输出max
for ((i=0;i< $ {#arr[*]};i++ ))
do
if [ $max -lt ${arr[i]} ];then
max= $ {arr[i]}
fi
done
echo $max


3.
比较大小

array=(90 70 80 100 30 66)
echo "old_array:${array[*]}"
lt=${#array[*]}
#定义比较轮数,比较轮数为数组长度减一,从一开始
for ((i=1;i<$lt;i++))
do
#确定比较元素的位置,比较两个相邻元素,较大数往后放,比较次数随比较轮数减少
 for ((j=0;j<$lt-i;j++))
  do
#定义第一个元素的值
 first=${array[$j]}
#定义第二个元素的值
 k=$[$j+1] 
 second=${array[$k]}
#如果第一个元素比第二个元素大就互换
  if [ $first -gt $second ];then
#把第一个元素的值保存到临时变量中 
 temp=$first 
#把第二个元素的值赋给第一个元素
 array[$j]=$second
#把临时的变量赋给第二个元素
array[$k]=$temp

fi
done
done
echo "new_array:${array[@]}"

总结:

函数的运用可以将复杂重复的工作模块化,以达到更高效的工作

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859571.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号