shell函数
Linux shell也支持函数,但是函数的退出状态值只能是0或者1,如果脚本中有重复代码的时候,可以考虑使用函数。
在函数名前面可以加上关键字function,但是加与不加对函数的执行没有影响,函数中至少有一条命令,不允许空命令存在,函数之间通过参数、函数返回值进行通信,函数在脚本中出现的次序可以使任意的。
例如,新建一个脚本,函数名为hello,并调用,如图:

下图是一个循环调用函数的例子,结果为打印4行12345如图:

判断当前目录下存在多少个文件以及子目录,执行命令如下:

注意:函数调用是跟函数位置相关的,函数要在脚本的上方,下方内容调用函数,如果将函数放在下面,在上方调用会报错
下面例子为清理elk索引的例子,通过case结构和函数以及for循环实现,函数在上方,如下:
#!/bin/bash
: '
@function: clean elk log
@author: gongguan
@date: 2022-04-01
@说明: 本例子中只写出了2022年的,后续可以继续扩展到2023、2024年等,清理时候根据提示输入年份
和月份即可
@注意:函数要在脚本内容上方,否则调用会报错
'
cleanLog(){
for i in $(curl 'localhost:9200/_cat/indices?v' | awk '{print $3}')
do
result=$(echo $i | grep ''${month}'')
if [ -n "${result}" ];then
curl -XDELETE http://localhost:9200/${result}
fi
done
}
read -p "请输入要清楚的年份(2022/2023):" year
case $year in
2022)
read -p "请输入要清除的月份(01/02/03....):" month
case $month in
01)
cleanLog
;;
02)
cleanLog
;;
03)
cleanLog
;;
04)
cleanLog
;;
05)
cleanLog
;;
06)
cleanLog
;;
07)
cleanLog
;;
08)
cleanLog
;;
09)
cleanLog
;;
10)
cleanLog
;;
01)
cleanLog
;;
12)
cleanLog
;;
*)
echo "输入的月份不匹配"
esac
;;
*)
echo "年份不匹配,请重新输入....."
;;
esac
向函数传递参数
在shell编程中,向函数传递参数还是通过位置参数的方式,不支持传数组
1、向脚本中传递单个参数,并执行调用函数,查看结果,如图:

首先参数10赋值给m,下方调用函数的时候,m的值传递到函数中给n,n的值进行减半,从执行结果可以看出,m的值并没有发生变化,如图:

2、向函数传递多个参数,如图:


函数的返回值
有时候脚本执行完成后需要返回特定的值来完成脚本的后需动作,这些特定的值就是函数的返回值,shell编程中,通过return来表示退出状态,0表示无错误,1表示有错误
例如:根据返回值的不同来输出不同的结果,如果函数返回0则打印正确,返回1则打印错误,如图:

函数的调用
shell脚本中可以放置多个行数,函数之间可以相互调用,一个函数可以调用多个函数,脚本中如果放置多个函数,执行的时候将按照调用函数的顺序进行执行。
例如,在脚本中写入多个函数,并进行调用,如图:

函数相互调用
函数之间可以相互调用,调用时会停止运行当前函数转去运行被调用的函数,调用完成后再回来运行当前的函数。
例如:有三个函数,最后一个函数为调用函数,根据输入不同的值调用不同的函数,如图:



