目录

  • 传递参数
  • 递归函数
  • 一个脚本调另一个脚本函数



shell作为轻量级的脚本语言,也可以用户自定义函数,然后在shell脚本中调用,类似与Java中的类和方法。今天就来聊聊shell中函数的那些事。

shell函数的定义语法如下:
[ function ] funname [()]
{
action;
[return int;]
}

说明:
1、可以带function fun() 定义,也可以直接fun()定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255),只能返回数值,如果不是数值将会报错

传递参数

cat funcTest.sh

#!/bin/bash
parameters1=$1 #全局变量
parameters2=$2 #全局变量
function testFun() {                       #定义函数testFun
        local cc="this is cc"              #定义局部变量$cc
        local dd="this is dd"              #定义局部变量$dd
        echo $parameters1, $parameters2    #访问参数1和参数2
        echo $cc                           #打印局部变量
        return 0                           #shell函数返回值是整形,并且在0~257之间。
}

echo $dd                           #这里将会打印不生效,因为dd是局部变量。
testFun                               #使用函数testFun
sh funcTest.sh canshu1 canshu2

canshu1, canshu2
this is cc

parameters1 和 parameters2 定义的是全局变量。
cc 和 dd 定义的是局部变量,只能在函数 name 中使用。
$parameters1是第一个参数$1,$parameters2是第一个参数$2,以此类推$n是第n个参数$n。
return 0参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果作为返回值。

递归函数

bash也支持递归函数(能够调用自身的函数)例如:
cat digui.sh

#!/bin/bash

function name() {
        echo $1
        name hello
        sleep 1
}
name

运行此脚本后不断打印出hello,按Ctrl+C结束。

一个脚本调另一个脚本函数

创建文件并输出内容到文件中touchAndechoFiles .sh
cat touchAndechoFiles.sh

#!/bin/bash

dir_path=$2
start_day=$3
end_day=$4
#yesterday=`date -d -1day +%Y%m%d`

touchFiles() {
  #dir_path=$1
  #start_day=$2
  #end_day=$3
  while :
  do
    local start_day=$(date -d "$start_day 1day"  +%Y%m%d)
    local statis_day=`date -d "${start_day} -1 day" +%Y%m%d`
    touch ${dir_path}/${statis_day}.csv
    if [ $? -eq 0 ]; then #此处$?是接收上条命令是否成功,成为为0,失败为非0
      return 0
    else
      return 10
    fi
    echo start_day=$start_day
    echo statis_day=${statis_day}
    echo end_day=$end_day    

    if [ "${statis_day}" = "${end_day}" ]; then
      break;
    fi
  
  done 

}

echoFiles() {
  #dir_path=$1
  #start_day=$2
  #end_day=$3
  while :
  do
    local start_day=$(date -d "$start_day 1day" +%Y%m%d)
    local statis_day=`date -d "$start_day -1 day" +%Y%m%d`
    echo ${statis_day} >> ${dir_path}/${statis_day}.csv
    if [ $? -eq 0 ]; then 
      return 0
    else
      return 10
    fi
    echo start_day=$start_day
    echo statis_day=${statis_day}
    echo end_day=$end_day 
    
    if [ "${statis_day}" = "${end_day}" ]; then
      break;
    fi
  done

}

$1 $2 $3 $4

cat checkFiles1.sh

#!/bin/bash

dir_path=$1
start_day=$2
end_day=$3
files=$4
#yesterday=`date -d -1day +%Y%m%d`

checkFiles() {
  file_name=`ls $dir_path | grep "${files}"`
  if [ -z file_name ]; then
    echo $dir_path目录下没有您输入日期相对应的文件
  else
    echo $dir_path目录下包含您输入日期的文件有:$file_name
  fi
}

echo dir_path=$dir_path
echo start_day=$start_day
echo end_day=$end_day
echo files=$files

sh /home/oru/liuzhai/shell/test/touchAndechoFiles.sh touchFiles $dir_path $start_day $end_day

if [ $? -eq 0 ]; then #此处$?是接收上条命令调用函数的返回值
  sh /home/oru/liuzhai/shell/test/touchAndechoFiles.sh echoFiles $dir_path $start_day $end_day
  if [ $? -eq 0 ]; then
    checkFiles
  else
    echo 向文件输入内容失败!!!
  fi
else
  echo 创建文件失败!!!
fi

注意:因为在checkFiles1.sh脚本中调用了touchAndechoFiles.sh中的函数,并且进行了传参,所以在touchAndechoFiles.sh脚本最后需要将传入的参数写上,$1为预留的函数名称,如果touchAndechoFiles.sh脚本中最后一行没有写需要传入的参数,则脚本无法传参,如果没有函数名称的参数,则传入的参数将会错位(找这个bug找了好久才发现)。