shell函数
定义:将命令序列按照格式写在一起。格式指的是函数的固定格式。两种格式。
作用:方便重复使用。函数库,集中在一起,随时可以传参调用。大的工程分割成若干个小的功能模块,提高代码的可读性。
函数的格式:
#第一种函数格式
function shoping{命令序列}
#第二种函数格式
shoping () {命令序列}
#传参
function abc{num=$(($a*2))echo $num
}
a=10
abcfunction abc{read -p "输入一个数:" anum=$(($a*2))echo $num
}
function abc {read -p "输入一个数:" numif [ $num -eq $num ] &> /dev/nullthennum=$(($num*2))return 0elseecho "输入错误"return 1fi}
abc
if [ $? -eq 0 ]
then
echo 1
else
exit
fi
return的作用:return只能写在函数的内部,目的是从函数的内部获取一个返回值,用来判断是否执行下一个脚本。
echo $? 这个时候不再是判断执行结果,只是一个函数内部返回值,在使用return传返回码的时候,默认0是成功,非0都是失败。
返回码可以自定义,但是是有范围的,0~255
函数的传参方式以及函数变量的作用范围
sum () {num=$(($1+$2))echo $num
}
sum
read -p "1的数" num1
read -p “2的数” num2
sum $num1 $num2sum () {num=$(($1+$2))echo $num
}
a=1
b=2
sum
sum $a $bsum () {num=$(($1+$2))echo $num
}
sum
sum $1 $2
sh sum.sh 10 20
#在外面调用传参
abc () {a=5b=6
}
a=8
b=9
abc
echo $a $b#在函数内部定义了全局变量,外部的赋值是不能改变内部函数的全局变量
abc () {local a=5local b=6c=10
}
a=8
b=9
c=11
abc
echo $a $b $c
#加了local之后,就是函数内部的变量,而不再是全局变量,外部的赋值会替换内部的变量值abc () {echo "inside1 $a"let a++local aa=8echo "inside2 $a"
}
a=9
abc
echo "outside $a"
函数递归:函数调用自己本身的函数
#用函数递归的方式来实现阶乘
jiecheng () {if [ $1 -eq 1 ]thenecho 1elselocal temp=$(($1-1))local result=$(jiecheng $temp)echo "$(($1*$result))"fi
}
read -p "输入一个数:" num
result1=$(jiecheng $num)
echo "$result1"
#递归目录。把/opt日录下,所有的文件递归出来,如果只是目录且该目录下没有文件就打印目录。否则继续
#打印,直到目录里面没有文件为止
digui () {for file in `ls $1`doif [ -d "$1/$file" ]thenecho $filedigui "$1/$file"elseecho "$file"fidone
}
digui $1
函数库,函数库中只包含定义的函数,由另外一个脚本传入参数来调用我们定义的函数
jiafa () {result=$(($1+$2))echo $result
}
jianfa () {result=$(($1-$2))echo $result
}
chengfa () {result=$(($1*$2))echo $result
}. /opt/hanshu/hanshu8.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
练习
#小数和整数都可以运算?小数点后两位
vim hanshu8.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
}
vim diaoyong.sh
. /opt/hanshu/hanshu8.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
#所有文件,把后缀名是.txt的分件复制到/opt/dec当中。
digui () {for file in `ls $1`doif [ -d "$1/$file" ]thenecho $filedigui "$1/$file"elif [ -f "$file" ]; thenif [[ "$file" == *.txt ]];thencp "$file" /opt/decelseecho "$file"fifidone
}
digui $1