Shell 函数及数组
SHELL函数
函数的用法
基本格式
函数的调用
示例
函数变量的作用范围
示例
函数的参数
递归函数
SHELL 数组
数组定义的方法
数组的基本使用方法:
1.获取数组长度
2.读取某下标赋值
3.数组遍历
4.数组切片
5.数组替换
6.数组删除
SHELL函数
函数的用法
Shell 函数可用于存放一系列的指令。在 Shell 脚本执行的过程中,函数被置于内存中, 每次调用函数时不需要从硬盘读取,因此运行的速度比较快。在 Shell 编程中函数并非是必须的元素,但使用函数可以对程序进行更好的组织。将一些相对独立的代码变成函数,可以提高程序可读性与重用性,避免编写大量重复代码。
基本格式
“function”关键字表示定义一个函数,可以省略;
“{”符号表示函数执行命令的入口,该符号可以与函数名同行也可以在函数名下一行 的句首;
“}”符号表示函数体结束,两个大括号之间{ }是函数体;
“命令序列”部分可以是任意的 Shell 命令,也可以调用其他函数;
“return”表示退出函数返回一个退出值,通过返回值判断执行是否成功,也可以使用 exit 终止整个 Shell 脚本。
函数的调用
示例
#!/bin/bash
su() {
read -p "请输入第一个数:" NUM1 ;read -p "请输入第二个数:" NUM2
echo "你输入的俩个数为:$NUM1 和 $NUM2"
SUM=$((NUM1+NUM2))
echo "俩个数的和为: $SUM"
}
su
函数变量的作用范围
■函数在Shell脚本中仅在当前Shell环境中有效
■Shell脚本中变量默认全局有效
■将变量限定在函数内部使用local命令
示例
#!/bin/bash
myfun() {
local i
i=8
echo $i
}
i=9
myfun
echo $i
[root@localhost ~]# chmod +x si.sh
[root@localhost ~]# ./si.sh
函数的参数
在使用函数参数时,函数名称在前参数在后,函数名和参数之间用空格分隔,可以有多个参数,参数使用$1、$2、3……的方式表示。以此类推,从第10个参数开始,调用方法为3……的方式表示。以此类推,从第10个参数开始,调用方法为{10},不加大括号无法调用成功。
递归函数
Shell 也可以实现递归函数,就是可以调用自己本身的函数。在 Linux 系统上编写 Shell 脚本的时候,经常需要递归遍历系统的目录,列出目录下的文件和目录,逐层递归列出,并 对这些层级关系进行展示
#!/bin/bash
hanshu() {
for f in `ls $1` //$1指的是函数后的参数1,
do
if [ -d "$1/$f" ];then // 判断如果/var/log"是目录
echo "$2$f" //$2 指的是空格
hanshu "$1/$f" " $2" // 这边就是函数的调用,把所有的目录都扫描出来
else // 否则
echo "$2$f" // $f输出出来的就是文件了
fi
done
}
hanshu "/var/log" ""
SHELL 数组
Shell 脚本中,数组是一种常见的数据结构,主要的应用场景包括:获取数组长度、获取元素长度、遍历元素、元素切片、元素替换、元素删除等等。Shell 中的数组与 Java、C、Python 不同,只有一维数组,没有二维数组。数组元素的大小与限制,也不需要事先定义。Shell 数组用括号()来表示,元素用空格分隔,元素的下标与大部分编程语言类似从 0 开始。
数组定义的方法
数组的基本使用方法:
1.获取数组长度
[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ~]# b=${#a[*]}
[root@localhost ~]# echo $b
5
[root@localhost ~]# b=${#a[@]}
[root@localhost ~]# echo $b
5
以上演示了在获取数组的长度,【】中*号@的效果一样
2.读取某下标赋值
[root@localhost ~]# c=${a[2]}
[root@localhost ~]# echo $c
3
3.数组遍历
#!/bin/bash
a=(1 2 3 4 5)
for f in ${a[*]} // 这边要注意一定要以${a[*]}方式把数组拆散,如果直接引用$a的话,系统会试做数组a里面的元素是一个整体,之后echo输出的值会为1
do
echo "$f"
done
[root@localhost ~]# chmod +x yang.sh // 给脚本一个执行的权限
[root@localhost ~]# ./yang.sh // 以下是执行的效果
4.数组切片
[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ~]# echo ${a[*]} //输出的整个数组的元素
1 2 3 4 5
[root@localhost ~]# echo ${a[*]:2:3} // 输出索引对应的元素
3 4 5
[root@localhost ~]# echo ${a[*]:0:2}
1 2
5.数组替换
[root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ~]# echo ${a[*]/2/66} //${数组名[@或者*]/查找的字符/替换的字符}
1 66 3 4 5
6.数组删除
root@localhost ~]# a=(1 2 3 4 5)
root@localhost ~]# unset a
[root@localhost ~]# echo ${a[*]}
下面是空的,代表元素已经全部删除了
root@localhost ~]# a=(1 2 3 4 5)
[root@localhost ~]# unset a[2] // 这边演示一下删除单个索引对应的元素的值
[root@localhost ~]# echo ${a[*]}
1 2 4 5