深入浅出Linux-Shell编程[五】

举报
Maynor学长 发表于 2022/09/20 19:44:39 2022/09/20
【摘要】 ​三、Shell 编程之函数Shell 函数的本质是一段可以重复使用的脚本代码,  这段代码被提前编写好了,  放在了指定的位置,  使用时直接调 取即可1、定义函数  可以带function fun() 定义,  也可以直接fun() 定义,不带任何参数。# 方法一function name {commands[return value]}# 方法二name() {commands[ret...


三、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、调用函数

1、执不带参数的函数

  直接输入函数名即可,  不需要带括号,














函数时,  函数名前的关键字function和函数名后面的()均不需要带

的定义必须要在执行的程序前定义或加载

2、执行带参数的函数








functionName arg1 arg2




can't use 'macro parameter character #' in math mode



?/$@)均可以做为函数的参数行传递


$0特殊,  仍然是父脚本的名称

此时父脚本的参数会临时被函数的参数所掩盖或隐

的参数变量是在函数体内里面进行定义

3  函数的执行总结

Shell各种程序的执行顺序为:  系统别名->函数->系统命令->可执行文件等

函数执行时,  会和调用它的脚本共享变量,  也可以为函数设定局部变量及特殊位置参数   Shell函数里面,  returnexit功能类似,  区别是return是退出函数,  exit则是退出脚本 return语句会返回一个值给调用函数的程序,  exit则会返回一个值给执行当前脚本Shell 如果将函数单独存放为一个文件,  在加载时需要使source. 进行加载

在函数内部一般使local定义局部变量,  仅在函数体内有效

4、调用函数



















[root@qfedu.com  ~]# cat 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

[root@qfedu.com  ~]# bash testfunction.sh

Hello world

Welcome to qfedu

Hello Shell



5、从文件中调用函









3、函数参数传递





[root@qfedu.com  ~]# cat functionwithargs.sh

#!/bin/bash

function Add () {    # 定义函数

((sum=$1+$2))

echo "$1 + $2 sum is" ${sum}

}

Add $1 $2           # 调用函数并传递参数

[root@qfedu.com  ~]# bash functionwithargs.sh 100 150

100 + 150 sum is 250

[root@qfedu.com  ~]# bash functionwithargs.sh 509 150

509 + 150 sum is 659



4return 返回函数结果











  在该示例中,  主要通过 $? 获取返回值,  但返回值的范围只能是 0~255

5echo 回函数结果







[root@qfedu.com  ~]# cat functionwithecho.sh

#!/bin/bash

function TestReturn() {

if [ d $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


[root@qfedu.com  ~]# bash functionwithecho.sh /etc/sysconfig

/etc/sysconfig exist ,return value is: 122

[root@qfedu.com  ~]# bash functionwithecho.sh /etc/sysconfiggg

/etc/sysconfiggg not exist ,return value is: 222

  在该示例中,  主使用 $() 获取返回值,  在该方法中,  没有范围限制,  是一种比较安全的返回方式。








6、全局变量和局部变

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






[root@qfedu.com  ~]# cat test3.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


[root@qfedu.com  ~]# bash test3.sh

11 is larger than 6

4 is smaller than 6







7、数组变量和函数

   $@ 变量会单独处理每个参数


[root@qfedu.com  ~]# cat test4.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"



[root@qfedu.com  ~]# bash test4.sh

The result is 15



[root@qfedu.com  ~]# cat test5.sh

function arraydblr() {

local origarray

local newarray

local elements

local i

origarray=($(echo "$@"))

newarray=($(echo "$@"))

elements=$[ $# ‐1 ]

for (( i = 0; i <= $elements; i++))

{

newarray[$i]=$[ ${origarray[$i]} * 2 ]

}

echo ${newarray[*]}

}



myarray=(1 2 3 4 5)

arg1=$(echo ${myarray[*]})

result=($(arraydblr $arg1))

echo "The new array is: ${result[*]}"



[root@qfedu.com  ~]# cat test4.sh bash test5.sh

The new array is: 2 4 6 8 10







8递归函数

[root@qfedu.com  ~]# cat test6.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"

[root@qfedu.com  ~]# bash test6.sh
Enter value: 5
The factorial of 5 is: 120





【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。