shell函数语法

脚本中使用函数

创建函数的格式,有两种:

function name {

commands

}

name() {

commands

}

blob.png

blob.png

2. 函数返回值

使用函数输出

blob.png

blob.png

3.在函数中使用变量

3.1 向函数传递参数

函数可以使用标准的参数环境变量来代表命令行上传给函数的参数,如,函数名会在$0变量中定义,函数命令行的任何参数都会通过$1, $2等定义。也可以用特殊变量$#来判断传给函数的参数数目 ,函数可以用参数环境变量获得参数值。


3.1.1 在脚本中调用函数时传递参数,必须将参数和函数放在同一行

blob.png

blob.png

blob.png

 在命令行中传递参数给脚本中的函数

blob.png

blob.png

3.2 在函数中处理变量

函数会用两种类型的变量:

A 全局变量

B 局部变量

3.2.1 全局变量

默认情况下,你在脚本中定义的任何变量都是全局变量,在函数外定义的变量可在函数内正常访问

3.2.2 局部变量

不用在函数中使用全局变量,函数内部使用的任何变量都可以被声明成局部变量。要那么做时,只要在变量声明的前面加上local关键字就可以了,也可以在给变量赋值时在赋值语句中使用local关键字,local关键字保证了变量只局限在该函数中,如果脚本中在该函数之外有同样的名字的变量,那么shell将会保证这两个变量的值是分离的。

数组

数组

数组的作用以及意义与变量类似
变量:储存单个元素的内存空间。
数组:存储多个元素的连续的内存空间,相当于多个变量的集合
数组名和索引:
索引:编号从0开始,属于数值索引
注意:数组索引支持使用自定义格式,即为关联所索引,bash4.0版本之后开始支持
bash的数组支持稀疏格式(索引不连续)

声明数组:

declare -a ARRAY_NAME
declare -A ARRAY_NAME: 关联数组
注意:关联数组和一般数组之间不可相互转换

数组元素的赋值:

1.一次只赋值一个元素

ARRAY_NAME[INDEX]=VALUE
weekdays[0]="Sunday"
weekdays[4]="Thursday" #双引号可以不加,但是如果元素中含有空格需要双引号

2.一次赋值全部元素
ARRAY_NAME=("VAL1" "VAL2" "VAL3" ...)

引用数组

引用数组元素:
${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下标为0的元素
引用数组所有元素:
${ARRAY_NAME[*]}
${ARRAY_NAME[@]}
数组的长度(数组中元素的个数):
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}

数组处理

引用数组中的元素

数组切片: ${ARRAY[@]:offset:number}
offset:要跳过的元素个数
number:要取出的元素个数
取偏移量之后的所有元素:
${ARRAU[@]:offset}

关联数组

declare -A ARRAY_NAME
ARRAY_NAME=([idx_name1]='val1' [idx_name2]='val2‘...)
注意:关联数组必须先声明再调用

例题

1生成十个随机数保存在数组中,并找出其最大值和最小值

blob.png

blob.png

2将下图所示,实现转置矩阵matrix.sh

1 2 3   1 4 7

4 5 6 ===>  2 5 8

7 8 9           3 6 9

blob.png


blob.png