内容概要

  • 一、Shell函数介绍
  • 二、Shell函数格式
  • 函数返回值
  • 函数传参
  • 函数变量的作用范围
  • 递归阶乘
  • 递归目录
  • 创建函数库


一、Shell函数介绍

在我们编写Shell脚本的时候,经常会发现在多个地方使用了同一段代码。如果只是一小段代码也无关紧要,但是如果多次重写大的代码块就累人了。bash shell提供了函数这个功能。可以将我们的Shell 脚本封装起来,这样就能在脚本中的任何地方多次使用它了。

函数是一个脚本代码块,你可以为其命名并在代码中任何位置使用,需要在脚本中使用该代码块时,只要调用所起的函数名就行了。

二、Shell函数格式

格式1

function 函数名{
命令序列
[return x]
}

格式2

函数名(){
命令序列
[return x]
}

shell当前函数名 FUNCNAME shell中函数_Shell


shell当前函数名 FUNCNAME shell中函数_bash_02

函数返回值

1、return 表示退出函数并返回一个退出值,脚本中可以使用$? 变量显示该值。

2、使用规则:
(1)、函数已结束就取返回值,因为$? 变量只返回执行的最后一条命令的退出状态码。
(2)、退出状态码必须是0~255,超出时值将除以256取余。

shell当前函数名 FUNCNAME shell中函数_bash_03


shell当前函数名 FUNCNAME shell中函数_Shell_04


shell当前函数名 FUNCNAME shell中函数_bash_05

函数传参

sum () {
sum=$[$1+$2]
echo $sum
}
read -p “输入第一个参数:” s1
read -p “输入第二个参数:” s2
sum1 $s1 $s2

shell当前函数名 FUNCNAME shell中函数_shell当前函数名 FUNCNAME_06


shell当前函数名 FUNCNAME shell中函数_Shell_07

函数变量的作用范围

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

fun () {
local i
i=8
echo $i
}
i=5
fun
echo $i

shell当前函数名 FUNCNAME shell中函数_bash_08


shell当前函数名 FUNCNAME shell中函数_Shell_09


shell当前函数名 FUNCNAME shell中函数_bash_10


shell当前函数名 FUNCNAME shell中函数_bash_11

递归阶乘

递归函数其实就是自己调用自己

#!/bin/bash
i=1
fact() {
if [ $1 -eq 1 ]
then
  echo 1
else
  local temp=$[$1 - 1]
  local result=$(fact $temp)
  echo $[$1 * $result]
fi
}
  read -p "请输入:" n
  result=$(fact $n)
  echo "$n的阶乘为:$result"

shell当前函数名 FUNCNAME shell中函数_递归_12

递归目录
#!/bin/bash

function myfun () {
for f in $1/*
do
if [ -d $f ];then
    echo "$2$f"               #如果是目录就输出这个目录,$2为空格是用于区分父子目录
myfun "$f" " $2"

else
    if [ -x $f ];then
    echo "$2$f"      
 fi
fi

done
}

OLDIFS=$IFS
IFS=$IFS:

myfun "/root"

IFS=$OLDIFS

shell当前函数名 FUNCNAME shell中函数_Shell_13

创建函数库
[root@localhost /opt/test#]vim myfuncs.sh 

#!/bin/bash

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

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

jianfa() {
   echo $[$1 - $2]
}

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

shell当前函数名 FUNCNAME shell中函数_shell当前函数名 FUNCNAME_14

[root@localhost /opt/test#]vim fun7.sh 

. /opt/test/myfuncs.sh    ##调用函数库,路径要写对


read -p "请输入第一个数:" value1
read -p "请输入第二个数:" value2
result1=`jiafa $value1 $value2`
result2=`jianfa $value1 $value2`
result3=`chengfa $value1 $value2`
result4=`chufa $value1 $value2`


echo "加法:$result1"
echo "减法:$result2"
echo "乘法:$result3"
echo "除法:$result4"

shell当前函数名 FUNCNAME shell中函数_Shell_15