shell脚本之函数
- 2024-06-18 18:49
- 50人 已看
函数
shell的函数
定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。
作用:方面重复使用。函数库,集中在一起,随时可以传参调用。可以把大的工程分割成若干个小的功能模块,提高代码的可读性。
函数的格式
第一种格式function shoping {
命令序列
}
(常用)第二种格式 shoping () {
命令序列
}


return 的作用:
return只能写在函数的内部,目的是为了从函数的内部获取一个返回值,用来判断是否执行下一个脚本。echo ? 这个时候不再是判断执行结果,只是一个函数内部的返回值
在使用return传返回码的时候,默认0是成功,非0都是失败。返回码可以自定义,范围是0-255。
函数的传参方式以及函数变量的作用范围:
sum () {
sum=$(($1+$2))
echo $sum
}
read -p "请输入第一个数" num1
read -p ”请输入第二个数“ num2
sum $num1 $num2
abc ( ) {
a=5
b=6
}
a=8
b=9
abc
echo $a
echo $b
在函数内部定义了全局变量,外部的赋值是不能改变内部函数的全局变量的


加了local之后,就是函数内部的变量,而不再是全局变量,外部的赋值会替换内部的变量值。

函数递归:
函数调用自己本身的函数
阶乘 4的阶乘 4 3 2 1=24 1=21 5 5 4 3 2 1 =120
用函数递归的方式来实现阶乘
jiecheng () {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$(($1-1))
local result=$(($jiecheng $temp))
echo "$(($1*$result))"
fi
}
read -p "输入一个数":num
result1=jiecheng $num
echo $result



abc () {:定义了一个名为 abc 的函数。
for file in ls $1``:使用 ls $1获取指定目录(由参数\$1表示)下的所有文件和目录列表,并逐个将它们赋值给变量file\,进行循环处理。
if [ -d "$1/$file" ]:判断当前的 file 是否是一个目录(通过检查是否为目录来确定)。
then:如果是目录,执行下面的操作。
echo "$1/$file":输出这个目录的路径。
abc "$1/$file":递归调用自身来处理这个子目录。
else:如果不是目录,执行下面的操作。
echo "$1/$file":输出这个文件的路径。
case $file in:开始根据文件的名称进行情况判断。
*.txt):如果文件是以 .txt 结尾。
cp "$1/$file" /opt/dec:将该文本文件复制到 /opt/dec 目录。
;;:情况判断的结束标志。
*):其他情况(即不是 .txt 文件的情况)。
esac:结束情况判断。
fi:结束条件判断。
done:结束循环。
abc $1:在函数定义外,调用 abc 函数并传入参数 $1
函数库;
函数库中只包含定义的函数,由另外一个脚本传入参数来调用我们定义的函数。
小练习
用递归的方式,把opt目录下所有的文件递归出来,如果只是目录且该目录下没有文件就打印目录。否则继续打印,直到目录里面没有文件为止,然后筛选出.txt的文件复制到/opt/dec目录当中。

运行一下

切换到dec这个目录下:

复制成功!