shell函数的定义
定义:将命令序列按照格式写在一起.格式指的是函数的固定格式
作用:方便重复使用,还可以做成函数库,集中在一起,随时可以传参调用,大的工程分割成小的模块,提高代码的可读性.
函数的格式
vim hanshu1.sh
function shopping {
命令序列
}
shopping () {
命令序列
}
示例
function abc {
read -p "输入一个数" num
a=$(($num*2))
echo $a
}
abc
:wq
函数返回值
return的作用
只能写在函数的内部,目的是从函数的内部获取一个返回值,用来判断是否继续执行下一个脚本.
在使用return $?传返回码的时候,默认0是成功,非0都是失败,返回码可以自定义,范围是0-255之间,超过了就会大数字/255,取余
function abc {
read -p "输入一个数" num
a=$(($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
:wq
bash chuancan.sh 1 2
abc (){
a=5
b=6
}
a=8
b=9
abc
echo $a
echo $b
在函数内部定义了全局变量,外部的赋值是不能改变内部函数的全局变量的
[[ $num =~ ^-?[0-9]+$ ]]
abc (){
local a=5
local b=6
c=10
}
a=8
b=9
abc
echo $a
echo $b
echo $c
在加了local之后,就是函数内部的变来那个,而不再是全局变来那个,外部的赋值会替换内部的变量
abc (){
echo "inside1 $a "
let a++
local a
echo "inside3 $a"
a=8
echo "inside2 $a"
}
a=9
abc
echo "outside $a"
函数递归
函数调用自己本身的函数
阶乘举例
4的阶乘 4*3*2*1=24
vim jc.sh
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
函数库
函数库中,只包含定义的函数,由另外一个脚本传入参数来调用我们定义的函数
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`
do
if [[ -d "$1/$file" ]]
then
echo $file
mulu "$1/$file"
else
echo "这是个文件,直接打印"
echo "$file"
fi
done
}
mulu $1
练习2
把后缀名是.txt的文件复制到/opt/dec当中
mulu () {
for file in `ls $1`
do
if [[ -d "$1/$file" ]]
then
echo $file
mulu "$1/$file"
else
echo "这是个文件,直接打印" "$file"
if [[ "$file" == *.txt ]]
then
cp $file /opt/dec/
fi
fi
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