Shell 函数

一、Shell函数概述

1. Shell函数的概念

将命令序列按格式写在一起,可方便重复使用命令序列

2. Shell函数定义

方式一:

function 函数名 {
  命令序列
}

方式二:

函数名() {
  命令序列
}

3. 调用函数的方法

函数名 [参数1] [参数2]

4. 函数返回值

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

5. 函数的作用范围

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

#!/bin/bash

test() {
local i       #i为内部变量
i=8           #内部变量i为8
echo          #echo内部变量i
}
i=9           #外部变量i为9
test
echo $i       #echo外部变量i
[root@localhost ~]# ./test
8             #内部变量i先被echo
9             #外部变量i后被echo

6. 函数的参数

(1)参数的用法

函数名称 参数1 参数2 参数3……

(2)参数的表示方法

$1 $2 $3 …… ${10} ${11} ……

#!/bin/bash

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

sum1 $1 $2
[root@localhost ~]# ./jiafa.sh 1 2
3

二、递归函数

1. 阶乘

调用自己本身的函数

#!/bin/bash

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 $result
[root@localhost ~]# ./fact.sh
请输入一个阶乘的数字:5
120
[root@localhost ~]# ./fact.sh
请输入一个阶乘的数字:10
3628800

2. 递归目录

#!/bin/bash

list_files() {
  for i in $(ls $1)
  do
    if [ -d "$1/$i" ];then
      echo "$2$i/"
      list_files "$1/$i" " $2"
    else
      if [ ! -x $1/$i ];then
        echo "$2$i"
      fi
    fi
  done
}

################main###############
OLDIFS=$IFS
IFS=$IFS':'

for floder in $PATH
do
  echo "$floder/"
  list_files "$floder" " "
done

IFS=$OLDIFS
[root@localhost ~]# ./jiansuo.sh
/usr/local/sbin/
/usr/local/bin/
/usr/sbin/
/usr/bin/
/root/bin/
 aa/
  bb/
   cc/
    dd/
     abc.txt

三、创建函数库

1. 函数库的定义

函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。用户也可以根据自己的需要建立自己的用户函数库。

2. 函数库的作用

C语言库函数是把自定义函数放到库里,是别人把一些常用到的函数编完放到一个文件里,供程序员使用。程序员用的时候把它所在的文件名用#include<>加到里面就可以了(尖括号内填写文件名),例如#include<math.h>。

3. 创建函数库

#!/bin/bash

fact() {
  if [ $1 -eq 1 ];then
    echo 1
  else
    local temp=$[$1-1]
    local result=$(fact $temp)
    echo $[$1 * $result]
  fi
}

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

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

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

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

4. 调用函数库

#!/bin/bash

. suanfa.sh

v1=$1
v2=$2

res1=$(jiafa $v1 $v2)
res2=$(jianfa $v1 $v2)
res3=$(chengfa $v1 $v2)
res4=$(chufa $v1 $v2)
res5=$(fact $v1)

echo "加法的结果为 $res1"
echo "减法的结果为 $res2"
echo "乘法的结果为 $res3"
echo "除法的结果为 $res4"
echo "$1 阶乘的结果为 $res5"
[root@localhost ~]# ./jisuan.sh 10 5
加法的结果为 15
减法的结果为 5
乘法的结果为 50
除法的结果为 2
10 阶乘的结果为 3628800
[root@localhost ~]# ./jisuan.sh 5 0
加法的结果为 5
减法的结果为 5
乘法的结果为 0
除法的结果为 被除数不能为0!
5 阶乘的结果为 120
posted @ 2021-08-11 19:37  DoYouWantMore  阅读(51)  评论(0编辑  收藏  举报