个人技术分享

函数

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这个目录下:

复制成功!