shell函数
函数定义:
将命令序列按照格式写在一起。格式指的是函数的固定格式。 两种格式
函数作用:
方便重复使用。函数库,集中在一起,随时可以传参调用。大的工程分割成若干个小的功能模块,提高代码的可读性。
函数的格式
格式1 function shoping { 命令序列 } 格式2 shoping () { 命令序列 }
函数名后的参数可以为空
[root@test2 opt]# vim hanshu1.sh function abc { sum=$(($a*2)) echo $sum } a=10 abc [root@test2 opt]# vim hanshu1.sh function abc { read -p "输入一个数" sum a=$(($sum*2)) echo $a } abc
函数中的$?
function abc { read -p "输入一个数" sum sum=$(($sum*2)) return $sum } abc echo $? 表示打印函数中的结果
return的作用
return只能写在函数的内部,目的是从函数内部获取一个返回值,用来判断是否继续执行下一个脚本。
echo $? 这个时候不再是判断结果,只是一个函数内部的返回值,在使用return传回码的时候,默认0是成功,非0都是失败。返回码可以自定义,但是范围在0-255内。
[root@test2 opt]# vim hanshu1.sh function abc { read -p "输入一个数" sum if [ $sum -eq $sum ] &> /dev/null then sum=$(($sum*2)) return 0 else echo "输入错误" return 1 fi } abc if [ $? -eq 0 ] then echo “ok” else exit fi wq!
结果
[root@test2 opt]# sh hanshu1.sh 输入一个数10 ok [root@test2 opt]# sh hanshu1.sh 输入一个数test 输入错误 [root@test2 opt]#
函数的传参方式以及函数变量的作用范围
外部赋值
[root@test2 opt]# vim hanshu1.sh sum () { num=$(($1+$2)) echo $num } sum $1 $2 结果 在外部赋值 [root@test2 opt]# sh hanshu1.sh 10 20 30
内部赋值
[root@test2 opt]# vim hanshu1.sh sum () { num=$(($a+$b)) echo $num } a=10 b=20 sum $1 $2 结果 在函数内部赋值 [root@test2 opt]# sh hanshu1.sh 30
[root@test2 opt]# vim hanshu1.sh sum () { num=$(($1+$2)) echo $num } read -p "输入一个数" num1 read -p "输入一个数" num2 sum $num1 $num2 [root@test2 opt]# sh hanshu1.sh 输入一个数10 输入一个数20 30
函数变量
[root@test2 opt]# vim hanshu1.sh abc () { a=5 b=6 } a=8 b=9 abc echo $a echo $b 结果 [root@test2 opt]# sh hanshu1.sh 5 6
在函数内部定义了全局变量,外部的赋值是不能改变内部函数的全局变量的
加了local之后,就是函数内部的变量,而不再是全局变量,外部的赋值会替换内部的变量值
[root@test2 opt]# vim hanshu1.sh abc () { local a=5 local b=6 c=10 } a=8 b=9 c=11 abc echo $a echo $b echo $c 结果 加了local之后的结果 [root@test2 opt]# sh hanshu1.sh 8 9 10
[root@test2 opt]# vim hanshu1.sh abc () { echo "inside1 $a" let a++ local a a=8 echo "inside2 $a" } a=9 abc echo "outside $a" 结果 [root@test2 opt]# sh hanshu1.sh inside1 9 inside2 8 outside 10
函数递归
函数递归:函数调用自己本身的函数
阶乘 4的阶乘 4 3 2 1 =24
用函数递归的方式实现阶乘
[root@test2 opt]# vim hanshu1.sh jc () { if [ $1 -eq 1 ] then echo 1 else local temp=$(($1-1)) local result=$(jc $temp) echo "$(($1*$result))" fi } read -p "输入一个数" num result1=`jc $num` echo $result1 结果 [root@test2 opt]# sh hanshu1.sh 输入一个数5 120
#递归目录。把/etc目录下,所有的文件递归出来,如果只是目录且该目录下没有文件就打印目录。否则继续
#打印,直到目录里面没有文件为止
[root@test2 opt]# vim hanshu1.sh digui () { for file in `ls $1` do if [ -d "$1/$file" ] then echo "$1$file" digui "$1/$file" else echo "$1/$file" fi done } digui $1 结果 [root@test2 opt]# sh hanshu1.sh /opt /opt/1 /opt/hanshu1.sh /opt/hosts.txt /opttest1 /opt/test1/aaa /opt/test1test2 /opt/test1.sh /opttest2 /opt/test2.sh /opt/users.txt
函数库
函数库中只包含定义的函数,有另外一个脚本传入参数来调用定义的函数。
[root@test2 opt]# vim dy.sh . /opt/hanshu1.sh read -p "输入一个数" sum1 read -p "输入一个数" sum2 a=`jiafa $sum1 $sum2` b=`jianfa $sum1 $sum2` c=`chengfa $sum1 $sum2` echo $a echo $b echo $c jiafa () { result=$(($1+$2)) echo $result } jianfa () { result=$(($1-$2)) echo $result } chengfa () { result=$(($1*$2)) echo $result } [root@test2 opt]# sh dy.sh 输入一个数10 输入一个数20 30 -10 200
实验1 将以.txt的文件复制到/opt/dec
[root@test2 opt]# vim test1.sh digui () { for file in `ls $1` do if [ -d "$1/$file" ] then echo "$file" digui "$1/$file" else if [[ "$file" == *.txt ]] then cp "$file" /opt/dec else echo "$file" fi fi done } digui $1 结果 [root@test2 opt]# sh test1.sh /opt ! 1 dec dy.sh hanshu1.sh test1 aaa test2 test1.sh test2 test2.sh [root@test2 opt]# ll /opt/dec 总用量 8 -rw-r--r--. 1 root root 94 6月 18 15:08 hosts.txt -rw-r--r--. 1 root root 13 6月 18 15:08 users.txt
实验2 调用小数运算,保留小数点后两位。
[root@test2 opt]# vim hanshu1.sh jiafa () { result=$( echo "cale=2; $1+$2" | bc ) echo $(scale=2;result) } jianfa () { result=$( echo "scale=2; $1-$2" | bc ) echo $result } chengfa () { result=$( echo "scale=2; $1*$2" | bc ) echo $result } 调用 [root@test2 opt]# vim dy.sh . /opt/hanshu1.sh read -p "输入一个数" sum1 read -p "输入一个数" sum2 a=`jiafa $sum1 $sum2` b=`jianfa $sum1 $sum2` c=`chengfa $sum1 $sum2` echo $a echo $b echo $c 结果 [root@test2 opt]# sh dy.sh 输入一个数2.22 输入一个数2.22 4.44 0 4.92标签:opt,test2,函数,sh,echo,shell,hanshu1,root From: https://blog.csdn.net/2402_84844434/article/details/139775111