shell函数的定义
定义:将命令序列按照格式写在一起.格式指的是函数的固定格式
作用:方便重复使用,还可以做成函数库,集中在一起,随时可以传参调用,大的工程分割成小的模块,提高代码的可读性.
函数的格式
vim hanshu1.shfunction shopping {命令序列}shopping () {命令序列}
示例
function abc {read -p "输入一个数" numa=$(($num*2))echo $a
}
abc:wq
函数返回值
return的作用
只能写在函数的内部,目的是从函数的内部获取一个返回值,用来判断是否继续执行下一个脚本.
在使用return $?传返回码的时候,默认0是成功,非0都是失败,返回码可以自定义,范围是0-255之间,超过了就会大数字/255,取余
function abc {read -p "输入一个数" numa=$(($num*2))return $a #return改变了$?的状态码性质,不再代表成功或失败,只代表返回的数字
}
abc
echo $?
:wq
函数的传参方式以及函数变量的作用范围
脚本内部传参
sum () {num=$(($1+$2))echo $num
}
read -p "第一个数字" num1
read -p "第一个数字" num2
sum $num1 $num2
脚本外部
vim chuancan.sh
sum () {num=$(($1+$2))echo $num
}
sum $1 $2
:wqbash chuancan.sh 1 2
abc (){a=5b=6
}
a=8
b=9
abc
echo $a
echo $b
在函数内部定义了全局变量,外部的赋值是不能改变内部函数的全局变量的[[ $num =~ ^-?[0-9]+$ ]]abc (){local a=5local b=6c=10
}
a=8
b=9
abc
echo $a
echo $b
echo $c
在加了local之后,就是函数内部的变来那个,而不再是全局变来那个,外部的赋值会替换内部的变量
abc (){echo "inside1 $a " let a++local aecho "inside3 $a"a=8echo "inside2 $a"
}
a=9
abc
echo "outside $a"
函数递归
函数调用自己本身的函数
阶乘举例
4的阶乘 4*3*2*1=24
vim jc.shjiecheng (){if [[ $1 -eq 1 ]]thenecho 1elselocal temp=$(($1-1))local result=$(jiecheng $temp)echo "$(($1*$result))"fi}read -p "输入一个数字" numresult1=`jiecheng $num`echo $result1
函数库
函数库中,只包含定义的函数,由另外一个脚本传入参数来调用我们定义的函数
vim jisuanhanshuku.sh
jiafa() {result=$( echo " $1+$2 " | bc )echo $result
}jianfa() {result=$( echo " $1-$2 " | bc )echo $result
}chengfa() {result=$( echo " $1*$2 " | bc)echo $result
}
练习1
递归目录.把/etc/目录下,所有文件递归出来
如果只是目录,且该目录下没有文件,就打印目录,否则继续打印,直到目录里面没有文件为止
mulu () {for file in `ls $1`doif [[ -d "$1/$file" ]]thenecho $filemulu "$1/$file"elseecho "这是个文件,直接打印"echo "$file"fi
done
}
mulu $1
练习2
把后缀名是.txt的文件复制到/opt/dec当中
mulu () {for file in `ls $1`doif [[ -d "$1/$file" ]]thenecho $filemulu "$1/$file"elseecho "这是个文件,直接打印" "$file"if [[ "$file" == *.txt ]]thencp $file /opt/dec/fifi
done
}
mulu $1
练习3
函数库加减乘除,要求小数和整数都可以运算,小数点后两位
vim jisuanhanshuku.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
}
chufa(){result=$( echo " scale=2; $1/$2 " | bc)echo $result
}vim jisuan.sh
. /root/jisuanhanshuku.sh
read -p "请输入第一个数" num1
read -p "请输入第二个数" num2
sum=`jiafa $num1 $num2`
sub=`jianfa $num1 $num2`
mult=`chengfa $num1 $num2`echo $sum
echo $sub
echo $mult