【Shell】Shell编程之函数

目录

1.Shell函数定义

2.Shell函数的作用

3.函数返回值

4.函数传参

5.函数变量的作用范围

案例


1.Shell函数定义

格式1

function 函数名 {
    命令序列
}

格式2

函数名() {
    命令序列
}

2.Shell函数的作用

使用函数可以避免代码重复
使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

PS:看一个人编的脚本多不多规不规范熟不熟练,就看他编写的脚本有没有大量用函数,如果脚本里全是代码没有函数就知道这个人一定是个小白。


3.函数返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2、退出状态码必须是0~255,超出时值将为除以256取余

function db1 {
  read -p "请输入:" value
  return $[$value * 2]
}
db1
echo $?

db1() {
  read -p "请输入:" value
  echo $[$value * 2]
}
result=`db1`
echo $result


4.函数传参:

sum1() {
    sum=$[$1 + $2]
    echo $sum
}
read -p "输入第一个参数:" first
read -p "输入第二个参数:" second
sum1 $first $second

sum2() {
    sum=$[$1 + $2]
    echo $sum
}
sum2 $1 $2

5.函数变量的作用范围:

函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令

#!/bin/bash
#输出9,因为i的值被覆盖了

i=8
i=9
echo $i
#!/bin/bash
#输出8,主函数开始运行,第一步函数调用i=9,然后i=8覆盖后输出
 
myfun() {
    i=9
}
########## main ###########
myfun
i=8
echo $i

 

案例

使用函数 输出菱形,并实现可通过输入数值的大小来伸缩菱形的大小

myfun() {
local i
i=8
echo $i
}
i=9
myfun
echo $i


递归
函数调用自己本身的函数

#!/bin/bash
#使用递归计算阶乘
 
fact() {
        if [ $1 -eq 1 ]
        #$1,表示函数后面调用的变量,如果调用的值是1,输出值就是1
        then
                echo 1
        else
                local temp=$[$1-1]
                #定义一个变量temp为传入函数的参数减1,并且为局部变量
                local result=$(fact $temp)
                #每次调用函数自己,每次temp减1,直到为1
                echo $[$1 * $result]
        fi
}
 
##### main #####
read -p "请输入一个正整数:" num
result=$(fact $num)
#跟上面的result不影响,上面的result是局部变量,仅在函数内有效
echo "$num 的阶乘为: $result"
 
 
########实现过程
 
fact 5
 
$1=5   temp=4   result=$(fact 4)   echo 5 * $(fact 4)
$1=4   temp=3   result=$(fact 3)   echo 5 * 4*$(fact 3)
$1=3   temp=2   result=$(fact 2)   echo 5 * 4 * 3*$(fact 2)
$1=2   temp=1   result=$(fact 1)   echo 5 * 4 * 3 * 2*$(fact 1)
$1=1                                                2*1

 

#递归目录
function list_files {
for f in `ls $1`
do
   if [ -d "$1/$f" ]
   then
      echo "$2$f"
      list_files "$1/$f" " $2"
   else
       echo "$2$f"
   fi
done
}

list_files "/var/log" ""

创建库

可以事先创建一个函数库,在里面定义各种常用的函数然后可以在别的shell脚本中直接引用

vim myfuncs.sh


jiafa() {
  echo $[$1 + $2]
}

chengfa() {
  echo $[$1 * $2]
}

chufa() {
  if [ $2 -ne 0 ];then
    echo $[$1 / $2]
  else
    echo "$2不能为0"
  fi
}


vim test.sh
. myfuncs.sh

value1=10
value2=5
result1=`jiafa $value1 $value2`
result2=`chengfa $value1 $value2`
result3=`chufa $value1 $value2`
echo "加法结果为:$result1"
echo "乘法结果为:$result2"
echo "除法结果为:$result3"

vim function.sh
servicectl_usage() {
   echo "Usage:servicectl <service-name> <start|stop|restart|reload|status>"
   return 1
}

chk_centos_ver() {
   grep "CentOS.*release 7." /etc/centos-release &> /dev/null && echo "7"
   grep "CentOS.*release 6." /etc/centos-release &> /dev/null && echo "6"
   grep "CentOS.*release 5." /etc/centos-release &> /dev/null && echo "5"
}

servicectl() {
   [[ -z $1 || -z $2 ]] && servicectl_usage
   [ $(chk_centos_ver) == "7" ] && systemctl $2 ${1}.service || service $1 $2
}

servicectl $1 $2

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值