shell编程之函数

shell函数的本质是一段可以重复使用的脚步代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调用即可
1、定义函数
可以带function fun()定义,也可以直接fun()定义,不带任何常数
#方法一
function name {
commands
[return value]
}
#方法二
name() {
commands
[return value]
}
function 是shell中的关键字,专门用来定义函数;
name 是函数名;
commands 是函数要执行的代码,也就是一组语句;
return value 表示函数的返回值,其中return是shell的关键字,专门用在函数中返回一个值;这一部分可以写也可以不写
由{}包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码
函数的优势
方便n次使用,减少代码量,使之方便,整洁
当需要修改里面的重复代码时,只需要修改一次函数即可实现需求
将函数写进文件,需要时直接通过文件调用
2、调用函数
2.1、执行不带参数的函数
直接输入函数名即可,不需要带括号
functionName
执行函数时,函数名前的关键字function和函数名后面的()均不需要带
函数的定义必须要在执行的程序前定义或加载
2.2、执行带参数的函数
functionName arg1 arg2
Shell中的位置参数(1/2./$@)均可以做为函数的参数进行传递
$0比较特殊,仍然是父脚本的名称
此时父脚本的参数会临时被函数的参数所掩盖或隐藏
函数的参数变量是在函数体内里面进行定义
2.3、函数的执行总结
Shell各种程序的执行顺序为:系统别名>函数->系统命令>可执行文件等
函数执行时,会和调用它的脚本共享变量,也可以为函数设定局部变量及特殊位置参数
在Shell函数里面,return和exit功能类似,区别是return是退出函数,exit则是退出脚本
return语句会返回一个值给调用函数的程序,exit则会返回一个值给执行当前脚本的Shell
如果将函数单独存放为一个文件,在加载时需要使用source或.进行加载
在函数内部一般使用local定义局部变量,仅在函数体内有效
2.4、调用函数

  vi testfunction. sh
#!/bin/bash
#first function 
function HelloWorld() {
echo "Hello world"
}
#second function
Welcome() {
echo "Welcome to qfedu"
}
#third function
function HelloShell {
echo "Hello Shell"
}
#file functions
HelloWorld              #调用函数
Welcome
HelloShell
  #运行脚本
  bash testfunction.sh

在这里插入图片描述
2.5、从文件中调用函数

  vi filefunction.sh
function Sum() {
for((i=1;i<=100;i++))
do
((sum=sum+i)) 
done 
echo '{1..100} sum is :' $sum
}
  vi filefunctionfromfile.sh
path="f1lefunction.sh"
if [ -f ${path} ]   #判断${path}是否为文件
then
source $path  #加载函数
Sum   #调用函数
else
echo "file not exist or error"
fi
  #运行脚本
  vi filefunctionfromfile.sh

在这里插入图片描述
3、函数参数传递

function Add () {        #定义函数
((sum=$1+$2))
echo "$1+$2 sum is" ${sum}
}
Add $1 $2         #调用函数并传递参数
  #运行脚本
  bash 2.sh 100 50

在这里插入图片描述
4、return 返回函数结果

  vi 3.sh
function TestReturn(){
if [ -d $1 ]       #判断$1是否为目录
then
return "122"
else
return "222"
fi 
}
TestReturn $1
result=$?      #获取函数返回值
if [ ${result} == "122" ]
then 
echo "$1 exist,return value is:" ${result}
else 
echo "$1 not exist,return value is:" ${result}
fi
  #运行脚本
  bash 3.sh /etc/hosts
  bash 3.sh /etc/yum

在这里插入图片描述
在该示例中,主要通过$?获取返回值,但返回值的范围只能是0-255
5、echo返回函数结果

  vi 4.sh
function TestReturn(){
if [ -d $1 ]       #判断$1是否为目录
then
echo "122"
else
echo "222"
fi 
}
result=$(TestReturn $1#获取函数返回值
if [ ${result} == "122" ]
then 
echo "$1 exist,return value is:" ${result}
else 
echo "$1 not exist,return value is:" ${result}
fi
  #运行脚本
  bash 4.sh /etc/yum
  bash 4.sh /etc/group

在这里插入图片描述
在该示例中,主要使用$()获取返回值,在该方法中,没有范围限制,是一种比较安全的返回方式

6、全局变量和局部变量
全局变量在shell脚本中任何地方都能使用;局部变量在函数内部使用,声明前加一个local就好

  vi 5.sh
function fun () {
a=$[ $b + 5 ]
c=$[ $a * 2 ]
}
a=4
b=6
fun
if [ $a -gt $b ]
then
echo "$a is larger than $b"
else
echo "$a is smaller than $b"
fi
function fun () {
local a=$[ $b + 5 ]
c=$[ $a * 2 ]
}
a=4
b=6
fun
if [ $a -gt $b ]
then
echo "$a is larger than $b"
else
echo "$a is smaller than $b"
fi
  #运行脚本
  bash 5.sh

在这里插入图片描述
7、数组变量和函数
$@变量会单独处理每个函数

  vi 6.sh
function addarray () {
local sum=0
local newarray
newarray=($(echo "$@"))
for value in ${newarray[*]}
do
  sum=$[ $sum + $value ]
done
echo $sum
}
myarray=(1 2 3 4 5)
#这里arg1=${myarray[*])也可以
arg1=$(echo ${myarray[*]})
result=$(addarray $arg1)
echo "The result is $result"
  #运行脚本
  bash 6.sh

在这里插入图片描述
8、递归函数

  vi 7.sh
function factorial () {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 - 1 ]
local result=$(factorial $temp)
echo $[ $result * $1]
fi
}
read -p "Enter value:" value
result=$(factorial $value)
echo "The factorial of $value is:$result"
  #运行脚本
  bash 7.sh

在这里插入图片描述

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页