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脚本中可以放置多个行数,函数之间可以相互调用,一个函数可以调用多个函数,脚本中如果放置多个函数,执行的时候将按照调用函数的顺序进行执行。

例如,在脚本中写入多个函数,并进行调用,如图:

函数相互调用

函数之间可以相互调用,调用时会停止运行当前函数转去运行被调用的函数,调用完成后再回来运行当前的函数。

例如:有三个函数,最后一个函数为调用函数,根据输入不同的值调用不同的函数,如图:

标签