函数
shell的函数
函数的定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。
for i in {} do 命令序列 done
函数作用:方便重复使用。函数库,集中在一起,随时可以传参调用。大的工程分割成若干个小的功能模块,提高代码的可读性。
购物
展示
结算
支付
物流
函数的两种格式:
function shoping { 命令序列 }
shoping () { 命令序列 }
第一种格式的使用方法
function abc { num=$(($a*2)) sum=$(($a+10)) echo $num } read -p "" a abc echo $sum
将函数里的值传到函数外
function abc { read -p "请输入一个数:" num if [ $num -eq $num ] &> /dev/null then num=$(($num*2)) return 0 else return 1 fi } abc echo $num if [ $? -eq 0 ] then echo "ok" else exit fi #return的作用,return只能写在函数的内部,目的是从函数的内部获取一个返回值,用来判断是否继续执行下一个脚本。 #echo $? 这个时候不再是判断执行结果,只是一个函数内部的返回值 #在使用return传回返回码的时候,默认0是成功,非0都是失败。返回码可以自定义,范围0~255。
#函数的传参方式以及函数变量的作用范围: sum () { num=$(($1+$2)) echo $num } sum $1 $2 [root@localhost opt]# sh hanshu2.sh 10 20 30
#函数的传参方式以及函数变量的作用范围: abc () { local a=5 b=6 } a=8 b=9 abc echo $a echo $b #在函数内部定义了全局变量,外部的赋值是不能改变内部函数的全局变量的 #加了local之后就是函数内部的变量,而不再是全局变量,外部的赋值会替换内部的变量值
递归:
#函数递归:函数调用自己本身的函数 #阶乘 4的阶乘 4 3 2 1=24 #用函数递归的方式来实现阶乘 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 $result1
#递归目录。把/etc目录下,所有的文件递归出来,如果只是目录且该目录下没有文件就打印目录。否则就继续打印,直到目录里没有文件为止 digui () { for file in `ls $1` do if [ -d "$1/$file" ] then echo $file digui "$1/$file" else echo "$file" fi done } digui $1
函数的格式:
[root@localhost opt]# vim hanshu5.sh #函数库,函数库中只包含定义的函数,由另外一个脚本传入参数来调用我们定义的函数。 jiafa () { result=$(echo "scale=2;$1+$2" | bc ) echo $result } jianfa () { result=$( echo "scale=2;$1-$2" | bc) echo $result } chengfa () { result=$( echo "scale=2;$1*$2" | bc) echo $result } . /opt/hanshu5.sh read -p "输入第一个数:" num1 read -p "输入第二个数:" num2 [root@localhost opt]# vim diaoyong.sh sum=`jiafa $num1 $num2` sub=`jianfa $num1 $num2` mult=`chengfa $num1 $num2` echo "$num1+$num2=" $sum echo "$num1-$num2=" $sub echo "$num1*$num2=" $mult
#递归目录。把/etc目录下,所有的文件递归出来,如果只是目录且该目录下没有文件就打印目录。否则就继续打印,直到目录里没有文件为止 #把后缀名是.txt的文件复制到/opt/dec当中 digui () { for file in `ls $1` do if [ -d "$1/$file" ] then digui "$1/$file" else if [[ "$file" == *.txt ]] then cp "$1/$file" /opt/dec/ fi echo "$1/$file" fi done } digui $1