目录
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找了好久才发现)。