精华内容
下载资源
问答
  • shell函数
    千次阅读
    2021-12-12 22:01:46

    1、返回值的方式:

            方法一:return

            方法二: echo

    2、return和echo使用场景区别:

            (1).使用return返回值:

                    使用return返回值,只能返回1-255的整数

                    函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败

            (2).使用echo返回值:

                    使用echo可以返回任何字符串结果

                    通常用于返回数据,比如一个字符串值或者列表值

    3、场景示例

            (一) return使用场景

            函数通过return返回一个整数,这种场景通常是用来做判断的,也就是说在执行完函数之后,需要根据它的返回值做判断,通0表示成功,非0都是表示失败。

    #!/bin/bash
    
    this_pid=$$
    # 判断nginx进程是否正在运行
    function is_nginx_running
    {
    	ps -ef | grep nginx | grep -v grep | grep -v $this_pid &>/tmp/null
    	if [ $? -eq 0 ];then
    		# return 0,也可以省略0直接return,两个是等价
    		return
    	else
    		return 1
    	fi
    }
    # return在函数中的返回值,只是用来做状态判断的,根据状态值做下一步判断
    # 函数的返回值为0时,表示nginx服务运行正常输出 && 后字符串,否则返回 ||后字符串
    is_nginx_running && echo "Nginx is running" || echo "Nginx is stoped"
    
    
    # 运行脚本
    ~ % sh 29.echo_return_nginx.sh
    Nginx is stoped
    ~ % sudo nginx  # Mac 使用,Linux为 systemctl start nginx 
    ~ % sh 29.echo_return_nginx.sh
    Nginx is running

            (二) echo使用场景

              函数通过echo返回值,通常是返回数据用的,以供程序的其它地方使用。

    #!/bin/bash
    
    # 获取整个Linux系统上所拥有的所有用户
    function get_users
    {
    	# users=`cat /etc/passwd | cut -d: -f1` # linux使用
    	# Mac 使用
    	users=`cat /etc/passwd | tail -n+11 | cut -d: -f1 | cut -d_ -f2`
    	echo $users
    }
    
    # 执行该函数,返回值为用户列表
    # get_users
    
    # 遍历用户列表对用户名做处理
    user_list=`get_users`
    index=1
    for user in $user_list
    do
    	echo "This $index user is : $user"
    	index=$(($index+1))
    done
    
    
    # 运行脚本
    ~ % sh 30.echo_sys_user.sh
    This 1 user is : nobody
    This 2 user is : root
    ... ...
    This 109 user is : oahd
    更多相关内容
  • 一、Shell函数定义格式 shell函数定义格式,各部分说明如下: [ function ]等中括号括起来部分—-表示可选(即可有可无) your_function_name部分—-为函数名 your_shell_commands部分—-为函数代码;shell一般以...
  • Shell 函数参数

    2020-09-15 19:12:47
    主要为大家分享了Shell 函数参数,方便学习shell脚本的朋友
  • 主要介绍了Shell函数的7种用法介绍,本文讲解了在shell文件内部定义函数并引用、返回值、函数输出、向函数传递参数、全局变量与局部变量等内容,需要的朋友可以参考下
  • linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。Shell 函数定义的语法格式如下: [function] funname [()]{ 函数体 [return int;] } 格式1: 简化写法,不写 function 关键字: 函数名...

    1、函数定义

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。Shell 函数定义的语法格式如下:

    [function] funname [()]{

        函数体

        [return int;]

    }

    格式1:

    简化写法,不写 function 关键字:

    函数名(){

    函数体

    }

    格式2:

    这是标准写法,也推荐大家使用的写法:

    function 函数名(){

    命令序列

    }

    这样方便做到一看就懂。

    格式3:

    如果写了 function 关键字,也可以省略函数名后面的小括号:

    function 函数名{

    命令序列

    }

    说明:

    • function 是 Shell 中的关键字,专门用来定义函数;可以带function funname () 定义,也可以直接funname () 定义,不带任何参数;
    • funname 是函数名;
    • 函数体 是函数要执行的代码,也就是一组语句;
    • return int 表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写,如果不加,将以最后一条命令运行结果,作为返回值。

     

    2、函数变量

    Shell 函数的变量不像其它语言中需要在变量前定义变量类型什么的,更没有结果符号等。语法:

    num=1

    变量作用域

    局部变量:作用域是函数的生命周期;在函数结束时被自动销毁。定义局部变量的方法:

    local var=value

    本地变量:作用域是运行脚本的shell进程的生命周期;因此,其作用范围为当前shell

    示例一:

    #!/bin/bash

    #在函数外定义本地变量

    var="Hello,World"

     

    function show() {

    #在函数内改变变量内容

    var="Hi,var is changed"   #sheli中函数内部也是全局变量作用域

    }

    echo "$var"

    show

    echo "$var"

    输出结果:

    [guest@localhost shell]$ ./tempsh.sh

    Hello,World

    Hi,var is changed

    结果显示在调用函数后,原有的本地变量var被替换了。还好这个变量并不是重要的部分,想想若是PATH被替换了,那么这个函数的罪过就大了。因此我们如何即调用函数中定义的变量同时又不对本地变量造成任何影响呢?局部变量的出现就是为了解决这个问题。

    下面看看在使用了局部变量后的效果。

    #!/bin/bash

    #在函数外定义本地变量

    var="Hello,World"

     

    function show() {

    #在函数内改变变量内容

    local var="Hi,var is changed"

    echo "$var"

    }

    echo "$var"

    show

    echo "$var"

    输出结果

    [guest@localhost shell]$ ./tempsh.sh

    Hello,World

    Hi,var is changed

    Hello,World

    该实验结果说明,使用局部变量后,函数体中出现的变量作用范围只存在于当前函数生命周期。

     

    3、函数调用

    定义函数的代码段不会自动执行,而是在调用时执行;在函数定义好后,用户可以在shell 中直接调用,调用时不用带上();调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可。

    示例一:

    #!/bin/bash

    # 函数定义

    function show(){

        echo "Hello word"

    }

    # 函数调用

    show

    输出结果:

    Hello word

    函数调用成功。上边的例子是把函数把在脚本上边,那么如果放函数放在下边会怎样呢?

    无非就两种结果:1成功,2失败

    下面我们举例测试一下:

    示例二:

    #!/bin/bash

    # 函数调用

    show

     

    #函数定义

    function show(){

        echo "Hello word"

    }

    输出结果:

    ./tempsh.sh:行4: show: 未找到命令

    系统报错,为啥?为什么会报错呢?

    首先,脚本的执行顺序是从上到下顺序执行的,因此会先执行show,通过定义的环境变量$PATH定义的路径找不到show对应的命令因此报“show:未找到命令”。

    我们在终端命令行中输错命令报错也是这个原因。终端命令行默认会将最左面输入的内容当做命令,因此若是错误的命令,不是命令的命令等内容都会报错。

    通过上面的对比,我们至少知道函数的调用若是在同一个脚本中,调用操作需要在定义的函数后面。

     

    4、函数传参

    函数传参调用语法:

    函数名 参数1 参数2 ....

    如果传递参数,那么多个参数之间以空格分隔:

    funname param1 param2 param3

    不管是哪种形式,函数名字后面都不需要带括号。和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

    在Shell中,调用函数时可以向其传递参数。在函数体内部,函数中的变量均为全局变量,没有局部变量,若使用局部变量需要在变量前加上 local,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数....

    示例:

    #!/bin/bash

     

    function show(){

    echo "第一个参数为 $1 !"

    echo "第二个参数为 $2 !"

    echo "第十个参数为 $10 !"

    echo "第十个参数为 ${10} !"

    echo "第十一个参数为 ${11} !"

    echo "参数总数有 $# 个!"

    echo "作为一个字符串输出所有参数 $* !"

    }

     

    show 0 1 2 3 4 5 6 7 8 9 10 11

    输出结果:

    第一个参数为 0

    第二个参数为 1

    第十个参数为 10

    第十个参数为 9

    第十一个参数为 10

    参数总数有 12 个

    作为一个字符串输出所有参数 0 1 2 3 4 5 6 7 8 9 10 11

    注意:$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

    另外,还有几个特殊字符用来处理参数:

    参数处理说明
    $#传递到脚本的参数个数
    $*以一个单字符串显示所有向脚本传递的参数
    $$脚本运行的当前进程ID号
    $!后台运行的最后一个进程的ID号
    $@与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $-显示Shell使用的当前选项,与set命令功能相同。
    $?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

     

    5、函数返回值

    退出状态码

    在介绍函数返回值前先了解一下跟函数返回值有关的状态退出码。

    Shell 中运行的每个命令都使用退出状态码(exit status)来告诉shell它完成了处理。退出状态码是一个0-255之间的整数值,在命令结束运行时由命令传给shell。你可以捕获这个值并在脚本中使用。

    如何查看退出状态码呢?

    Linux提供了 $? 专属变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。你必须在你要查看的命令之后马上查看或使用 $? 变量。它的值会变成Shell中执行的最后一条命令的退出状态码。

    退出状态码大体分两种:

    • 一种是命令正确执行的状态码,该状态码为:0
    • 一种是命令错误执行的状态码,为1-255

     Linux退出状态码

    状态码描述
    0命令成功结束
    1通用未知错误
    2误用shell命令
    126命令不可执行
    127没找到命令
    128无效退出参数
    128+xLinux信号x的严重错误
    130命令通过Ctrl+C终止
    255退出状态码越界

    在脚本中也可以指定退出状态码的值,通过命令exit实现。

    状态码取值范围为0-255,如果在指定的状态码大于255,那么shell会通过模(模就是256)运算得到相应的退出状态码。

    示例一:

    成功的

    #!/bin/bash

    # 函数定义

    function show(){

    echo $(date +%Y%m%d)

    }

    show

    echo $?

    输出结果:

    0

    示例二:

    失败的

    #!/bin/bash

    SYS_DATE=$(date +%Y%m%d)

    echo $SYS_DATE

     

    # 函数定义

    function show(){

    log=`lt`

    echo log

    }

    show

    echo $?

    输出结果:

    [guest@localhost shell]$ ./tempsh.sh

    20191123

    ./tempsh.sh:行10: lt: 未找到命令

    log

    0

    这次,由于函数最后一行命令正确执行,函数的退出状态码就是0,尽管函数中有一条命令没有成功运行。

    使用函数的默认退出状态码是很危险的,幸运的是return命令可以解决这个问题。

    示例:

    #!/bin/bash

    SYS_DATE=$(date +%Y%m%d)

    echo $SYS_DATE

     

    # 函数定义

    function show(){

    log=`lt`

    echo log

    return 2

    }

    show

    echo $?

    输出结果:

    [guest@localhost shell]$ ./tempsh.sh

    20191123

    ./tempsh.sh:行10: lt: 未找到命令

     

    2

    还是使用相同的函数,在函数最后加上return指定的状态码2。

     

    函数返回值

    在Shell中,return语句只能返回某个0-255之间的整数值。在Shell中还有一种更优雅的方法帮助用户来获得函数执行后的某个结果,那就是使用echo。在函数中,用户需要将要返回的数据写入到标准输出(stout),通常这个操作是使用echo语句来完成的,然后在调用程序中将函数的执行结果赋值给一个变量。这种做法实际上就是一个命令替换的一个变种。

    Shell函数返回值,常用的两种方式:return、echo。

    1)return 语句

    Shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回,return只能用来返回整数值。

    示例一:

    #!/bin/bash

    function getResultFun(){

    echo "这是我的第一个 shell 函数!"

    return `expr 1 + 1`

    }

     

    getResultFun

    echo $?

    输出结果:

    这是我的第一个 shell 函数!

    2

    Shell 函数返回值只能是整形数值,一般是用来表示函数执行成功与否的,0表示成功,其他值表示失败。用函数返回值来返回函数执行结果是不合适的。如果return某个计算结果,比如一个字符串,往往会得到错误提示:“numeric argument required”。

    如果一定要让函数返回一个或多个值,可以定义全局变量,函数将计算结果赋给全局变量,然后脚本中其他地方通过访问全局变量,就可以获得那个函数“返回”的一个或多个执行结果了

    示例:

    #!/bin/sh

    function getStr(){

    return "string"

    }

     

    getStr

    echo $?

    输出如下:

    ./test.sh: line 5: return: string: numeric argument required

    255

    可以看到已经提示要求return 整数类型,真实返回值是255。当面对这种问题怎么解决呢?

    别急,断续看下去你就会找到你想要的答案了。

     

    2)echo 语句

    echo是通过输出到标准输出返回,可以返回任何类型的数据。

    示例:

    #!/bin/sh

     

    function test() {

    echo "arg1 = $1"

    if [ $1 = "1" ] ;then

    echo "1"

    else

    echo "0"

    fi

    }

     

    echo

    echo "test 1"

    test 1    #shell函数调用

     

    echo

    echo "test 0"

    test 0    #shell函数调用

     

    echo

    echo "test 2"

    test 2    #shell函数调用

    输出结果:

    test 1

    arg1 = 1

    1

     

    test 0

    arg1 = 0

    0

     

    test 2

    arg1 = 2

    0

     

    3)函数返回值总结

    学习了上面的函数返回值的操作后我们下面做个知识总结,我们先看一用例:

    #!/bin/bash

     

    function getResultFun(){

    echo "这是我的第一个 shell 函数!"

    return `expr 1 + 1`

    }

     

    getResultFun

    echo $?

     

    function getResultFun2(){

    echo "这是我的第二个 shell 函数!"

    expr 1 + 1

    }

     

    getResultFun2

    echo $?

     

    getResultFun

    echo 在这里插入命令!

    echo $?

    输出结果:

    这是我的第一个 shell 函数!

    2

    这是我的第二个 shell 函数!

    2

    0

    这是我的第一个 shell 函数!

    在这里插入命令!

    0

    这是为什么?

    因为调用 getResultFun2 后,函数最后一条命令 expr 1 + 1 得到的返回值($?值)为 0,意思是这个命令没有出错。所有的命令的返回值仅表示其是否出错,而不会有其他有含义的结果。

    第二次调用 getResultFun 后,没有立即查看 $? 的值,而是先插入了一条别的 echo 命令,最后再查看 $? 的值得到的是 0,也就是上一条 echo 命令的结果,而 getResultFun 的返回值被覆盖了。下面这个测试,连续使用两次 echo $?,得到的结果不同,更为直观:

    #!/bin/bash

    function getResult(){

        echo "这是我的第一个 shell 函数!"

        return `expr 1 + 1`

    }

     

    getResult

    echo $?

    echo $?

    输出结果:

    这是我的第一个 shell 函数!

    2

    0

    6、获取函数返回值

    我们上面谈到了函数定义、传参、调用、返回结果,那我们如果得到返回结果呢?上面也谈到了一种获取返回结果的方法 $? ,难道只有这一种方式吗?答案肯定不止。

    示例一:

    用 $? 获取返回值,上面已有介绍,在这里就不做介绍了。

    示例二:

    #!/bin/sh

    function getStr(){

    return "string"

    }

     

    #方法一

    echo `getStr`

     

    #方法二

    echo $(getStr)

    两种写法的原理一样的,将getStr当成命令执行,然后获取其标准输出。

    示例三:函数传参

    #!/bin/bash

     

    #创建目录

    function createDir(){

    if [ ! -d $1 ]; then

    mkdir -p $1

    fi

    }

     

    DIR="temp/"

    # 两者二先一

    #$(createDir $DIR)

    $(createDir "temp/")

    函数返回值获取的方法总结:

    • 用变量接收函数返回值,函数用echo等标准输出将要返回的东西打印出来。
    • 用 $? 来接收函数的执行状态,但是 $? 要紧跟在函数调用处的后面。

    参考资料:

    https://blog.csdn.net/xhaimail/article/details/103208901

    展开全文
  • linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。Shell 函数定义的语法格式如下: [function] funname [()]{ 函数体 [return int;] } 格式1: 简化写法,不写 function 关键字: 函数名(){ ...

    分享知识 传递快乐

     

    1、函数定义

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。Shell 函数定义的语法格式如下:

    [function] funname [()]{
        函数体
        [return int;]
    }

    格式1:

    简化写法,不写 function 关键字:

    函数名(){
        函数体
    }

    格式2:

    这是标准写法,也推荐大家使用的写法:

    function 函数名(){
    	命令序列
    }

    这样方便做到一看就懂。

    格式3:

    如果写了 function 关键字,也可以省略函数名后面的小括号:

    function 函数名{
    	命令序列
    }


    说明:

    • function 是 Shell 中的关键字,专门用来定义函数;可以带function funname () 定义,也可以直接funname () 定义,不带任何参数;
    • funname 是函数名;
    • 函数体 是函数要执行的代码,也就是一组语句;
    • return int 表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写,如果不加,将以最后一条命令运行结果,作为返回值。

     

    2、函数变量

    Shell 函数的变量不像其它语言中需要在变量前定义变量类型什么的,更没有结果符号等。语法:

    num=1

    变量作用域

    局部变量:作用域是函数的生命周期;在函数结束时被自动销毁。定义局部变量的方法:

    local VAR=VALUE

    本地变量:作用域是运行脚本的shell进程的生命周期;因此,其作用范围为当前shell

    示例一:

    #!/bin/bash
    
    #在函数外定义本地变量
    var="Hello,World"
    
    function show() {
        #在函数内改变变量内容
        var="Hi,var is changed"
    }
    echo "$var"
    show
    echo "$var"

    输出结果:

    [guest@localhost shell]$ ./tempsh.sh
    Hello,World
    Hi,var is changed

    结果显示在调用函数后,原有的本地变量var被替换了。还好这个变量并不是重要的部分,想想若是PATH被替换了,那么这个函数的罪过就大了。因此我们如何即调用函数中定义的变量同时又不对本地变量造成任何影响呢?局部变量的出现就是为了解决这个问题。

    下面看看在使用了局部变量后的效果。

    #!/bin/bash
    #在函数外定义本地变量
    var="Hello,World"
    
    function show() {
        #在函数内改变变量内容
        local var="Hi,var is changed"
        echo "$var"
    }
    echo "$var"
    show
    echo "$var"

    输出结果

    [guest@localhost shell]$ ./tempsh.sh
    Hello,World
    Hi,var is changed
    Hello,World

    该实验结果说明,使用局部变量后,函数体中出现的变量作用范围只存在于当前函数生命周期。

     

    3、函数调用

    定义函数的代码段不会自动执行,而是在调用时执行;在函数定义好后,用户可以在shell 中直接调用,调用时不用带上();调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可。

    示例一:

    #!/bin/bash
    
    # 函数定义
    function show(){
        echo "Hello word"
    }
    
    # 函数调用
    show

    输出结果:

    Hello word

    函数调用成功。上边的例子是把函数把在脚本上边,那么如果放函数放在下边会怎样呢?

    无非就两种结果:1成功,2失败

    下面我们举例测试一下:

    示例二:

    #!/bin/bash
    
    # 函数调用
    show
    
    #函数定义
    function show(){
        echo "Hello word"
    }

    输出结果:

    ./tempsh.sh:行4: show: 未找到命令

    系统报错,为啥?为什么会报错呢?

    首先,脚本的执行顺序是从上到下顺序执行的,因此会先执行show,通过定义的环境变量$PATH定义的路径找不到show对应的命令因此报“show:未找到命令”。

    我们在终端命令行中输错命令报错也是这个原因。终端命令行默认会将最左面输入的内容当做命令,因此若是错误的命令,不是命令的命令等内容都会报错。

    通过上面的对比,我们至少知道函数的调用若是在同一个脚本中,调用操作需要在定义的函数后面。

     

    4、函数传参

    函数传参调用语法:

    函数名 参数1 参数2 ....

    如果传递参数,那么多个参数之间以空格分隔:

    funname param1 param2 param3

    不管是哪种形式,函数名字后面都不需要带括号。和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

    在Shell中,调用函数时可以向其传递参数。在函数体内部,函数中的变量均为全局变量,没有局部变量,若使用局部变量需要在变量前加上 local,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数....

    示例:

    #!/bin/bash
    
    function show(){
        echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
        echo "第十个参数为 $10 !"
        echo "第十个参数为 ${10} !"
        echo "第十一个参数为 ${11} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
    }
    
    show 0 1 2 3 4 5 6 7 8 9 10 11

    输出结果:

    第一个参数为 0 
    第二个参数为 1 
    第十个参数为 10 
    第十个参数为 9 
    第十一个参数为 10 
    参数总数有 12 个
    作为一个字符串输出所有参数 0 1 2 3 4 5 6 7 8 9 10 11 

    注意:$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

    另外,还有几个特殊字符用来处理参数:

    参数处理说明
    $#传递到脚本的参数个数
    $*以一个单字符串显示所有向脚本传递的参数
    $$脚本运行的当前进程ID号
    $!后台运行的最后一个进程的ID号
    $@与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $-显示Shell使用的当前选项,与set命令功能相同。
    $?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

     

    5、函数返回值

    退出状态码

    在介绍函数返回值前先了解一下跟函数返回值有关的状态退出码。

    Shell 中运行的每个命令都使用退出状态码(exit status)来告诉shell它完成了处理。退出状态码是一个0-255之间的整数值,在命令结束运行时由命令传给shell。你可以捕获这个值并在脚本中使用。

    如何查看退出状态码呢?

    Linux提供了 $? 专属变量来保存上个执行的命令的退出状态码。你必须在你要查看的命令之后马上查看或使用 $? 变量。它的值会变成Shell中执行的最后一条命令的退出状态码。

    退出状态码大体分两种:

    • 一种是命令正确执行的状态码,该状态码为:0
    • 一种是命令错误执行的状态码,为1-255

     Linux退出状态码

    状态码描述
    0命令成功结束
    1通用未知错误
    2误用shell命令
    126命令不可执行
    127没找到命令
    128无效退出参数
    128+xLinux信号x的严重错误
    130命令通过Ctrl+C终止
    255退出状态码越界

    在脚本中也可以指定退出状态码的值,通过命令exit实现。

    状态码取值范围为0-255,如果在指定的状态码大于255,那么shell会通过模(模就是256)运算得到相应的退出状态码。

    示例一:

    成功的

    #!/bin/bash
    
    # 函数定义
    function show(){
        echo $(date +%Y%m%d)
    }
    show
    echo $?

    输出结果:

    0

    示例二:

    失败的

    #!/bin/bash
    
    SYS_DATE=$(date +%Y%m%d)
    
    echo $SYS_DATE
    
    # 函数定义
    function show(){
        log=`lt`
    	echo log
    }
    show
    echo $?

    输出结果:

    [guest@localhost shell]$ ./tempsh.sh 
    20191123
    ./tempsh.sh:行10: lt: 未找到命令
    log
    0
    

    这次,由于函数最后一行命令正确执行,函数的退出状态码就是0,尽管函数中有一条命令没有成功运行。

    使用函数的默认退出状态码是很危险的,幸运的是return命令可以解决这个问题。

    示例:

    #!/bin/bash
    
    SYS_DATE=$(date +%Y%m%d)
    
    echo $SYS_DATE
    
    # 函数定义
    function show(){
        log=`lt`
    	echo log
    	return 2
    }
    show
    echo $?

    输出结果:

    [guest@localhost shell]$ ./tempsh.sh 
    20191123
    ./tempsh.sh:行10: lt: 未找到命令
    
    2
    

    还是使用相同的函数,在函数最后加上return指定的状态码2。

     

    函数返回值

    Shell函数返回值,常用的两种方式:return、echo。

     

    1)return 语句

    Shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回,return只能用来返回整数值。

    示例一:

    #!/bin/bash
    
    function getResultFun(){
        echo "这是我的第一个 shell 函数!"
        return `expr 1 + 1`
    }
    
    getResultFun
    echo $?

    输出结果:

    这是我的第一个 shell 函数!
    2

    Shell 函数返回值只能是整形数值,一般是用来表示函数执行成功与否的,0表示成功,其他值表示失败。用函数返回值来返回函数执行结果是不合适的。如果return某个计算结果,比如一个字符串,往往会得到错误提示:“numeric argument required”。

    如果一定要让函数返回一个或多个值,可以定义全局变量,函数将计算结果赋给全局变量,然后脚本中其他地方通过访问全局变量,就可以获得那个函数“返回”的一个或多个执行结果了。

    示例:

    #!/bin/sh
    
    function getStr(){
    	return "string"
    }
    
    getStr
    echo $?

    输出如下:

    ./test.sh: line 5: return: string: numeric argument required
    255

    可以看到已经提示要求return 整数类型,真实返回值是255。当面对这种问题怎么解决呢?

    别急,断续看下去你就会找到你想要的答案了。

     

    2)echo 语句

    echo是通过输出到标准输出返回,可以返回任何类型的数据。

    示例:

    #!/bin/sh
    
    function test()  {
    	echo "arg1 = $1"
    	if [ $1 = "1" ] ;then
    		echo "1"
    	else
    		echo "0"
    	fi
    }
    
    echo
    echo "test 1"
    test 1
    
    echo
    echo "test 0"
    test 0
    
    echo
    echo "test 2"
    test 2

    输出结果:

    test 1
    arg1 = 1
    1
    
    test 0
    arg1 = 0
    0
    
    test 2
    arg1 = 2
    0

     

    3)函数返回值总结

    学习了上面的函数返回值的操作后我们下面做个知识总结,我们先看一用例:

    #!/bin/bash
    
    function getResultFun(){
        echo "这是我的第一个 shell 函数!"
        return `expr 1 + 1`
    }
    
    getResultFun
    echo $?
    
    function getResultFun2(){
     echo "这是我的第二个 shell 函数!"
     expr 1 + 1
    }
    
    getResultFun2
    echo $?
    
    getResultFun
    echo 在这里插入命令!
    echo $?

    输出结果:

    这是我的第一个 shell 函数!
    2
    这是我的第二个 shell 函数!
    2
    0
    这是我的第一个 shell 函数!
    在这里插入命令!
    0

    这是为什么?

    因为调用 getResultFun2 后,函数最后一条命令 expr 1 + 1 得到的返回值($?值)为 0,意思是这个命令没有出错。所有的命令的返回值仅表示其是否出错,而不会有其他有含义的结果。

    第二次调用 getResultFun 后,没有立即查看 $? 的值,而是先插入了一条别的 echo 命令,最后再查看 $? 的值得到的是 0,也就是上一条 echo 命令的结果,而 getResultFun 的返回值被覆盖了。下面这个测试,连续使用两次 echo $?,得到的结果不同,更为直观:

    #!/bin/bash
    
    function getResult(){
        echo "这是我的第一个 shell 函数!"
        return `expr 1 + 1`
    }
    
    getResult
    echo $?
    echo $?

    输出结果:

    这是我的第一个 shell 函数!
    2
    0

     

    6、获取函数返回值

    我们上面谈到了函数定义、传参、调用、返回结果,那我们如果得到返回结果呢?上面也谈到了一种获取返回结果的方法 $? ,难道只有这一种方式吗?答案肯定不止。

    示例一:

    用 $? 获取返回值,上面已有介绍,在这里就不做介绍了。

    示例二:

    #!/bin/sh
    
    function getStr(){
    	return "string"
    }
    
    #方法一
    echo `getStr` 
    
    #方法二
    echo $(getStr) 

    两种写法的原理一样的,将getStr当成命令执行,然后获取其标准输出。

    示例三:函数传参

    #!/bin/bash
    
    #创建目录
    function createDir(){
    	if [ ! -d $1 ]; then
    		mkdir -p $1
    	fi
    }
    
    DIR="temp/"
    # 两者二先一
    #$(createDir $DIR)
    $(createDir "temp/")

    函数返回值获取的方法总结:

    • 用变量接收函数返回值,函数用echo等标准输出将要返回的东西打印出来。
    • 用 $? 来接收函数的执行状态,但是 $? 要紧跟在函数调用处的后面。

     

     

     

     

     

     

     

     

     

     

    ———————————
    相互学习,共同进步
    如有不足请留言指正

    展开全文
  • Shell函数调用

    千次阅读 2022-04-30 10:19:46
    shell脚本中,有些命令或者某些操作需要频繁的使用时,每次都重新写太过繁琐,这时我们就可以使用函数,当需要使用时,直接调用函数使用即可。 一.函数基本格式 函数时将一些命令序列按格式写在一起,方便重复使用...


    在shell脚本中,有些命令或者某些操作需要频繁的使用时,每次都重新写太过繁琐,这时我们就可以使用函数,当需要使用时,直接调用函数使用即可。

    一.函数基本格式

    函数时将一些命令序列按格式写在一起,方便重复使用命令序列
    函数定义格式:

    方法一:
    function 函数名{
          命令序列
          return x  #显示函数的结束
    }
    方法二:
    函数名 (){
     命令序列
    }

    函数调用:

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

    二.函数调用

    2.1函数中调用

    直接在函数中调用当前函数
    在这里插入图片描述

    2.2函数调用函数

    在定义一个函数的时候,在其内也可以调用其它函数

    在这里插入图片描述

    2.3外部调用

    函数的作用在其模块化,方便下次使用的时候,直接调用使用。所以在我们每次写脚本时,可以直接调用之前写好的函数,只需在使用前进行声明即可。

    在这里插入图片描述

    2.4案例

    使用函数配置本地yum源仓
    在这里插入图片描述

    三.总结

    1.函数:封装的可重复使用的具有特点功能的代码,有点类似于命令别名
    2.函数可以在函数中直接调用,也可在函数外调用,
    3.外部调用时必须先声明调用的函数
    4.对于同名函数,只识别最后定义的函数

    展开全文
  • shell函数详解,基本使用&进阶使用

    千次阅读 2022-05-06 17:51:18
    shell函数详解,包含基础使用和进阶使用
  • 一、定义函数 代码如下:function fname(){statements;}或 代码如下:fname(){statements;} 二、调用函数 只需要使用函数名,即可调用某个函数:$ fname ; #执行函数 可以传递参数给函数,并由脚本进行访问:fname ...
  • Shell函数中传参

    千次阅读 2022-01-24 13:59:08
    注: 部分概念介绍来源于网络 ...使用如下语法来调用函数 name first second 函数名:restart 参数1 传递给函数的第一个参数(位置参数$1)。 参数2 传递给函数的第二个参数(位置参数$2)。 ...
  • Linux 在Shell脚本中使用函数实例详解 Shell函数 Shell程序也支持函数函数能完成一特定的功能,可以重复调用这个函数函数格式如下: 函数名() { 函数体 }  函数调用方式: 函数名 参数列表  实例:编写...
  • shell 函数

    千次阅读 2018-11-14 11:29:17
    function 函数名() { #<==推荐的书写函数的方法(带括号) 指令…… return n } #简化写法1: function 函数名{ #<==不推荐使用此方法(无括号) 指令…… return n } #...
  • shell函数传参和返回

    千次阅读 2019-12-21 22:18:45
    shell函数传参和返回结果,记录几个使用注意点。
  • Shell 函数

    千次阅读 2018-05-01 23:29:58
    Shell 函数linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。shell函数的定义格式如下:[ function ] funname [()] { action; [return int;] }说明:1、可以带function fun() 定义,也可以...
  • Shell函数与数组基础求和

    千次阅读 2020-10-18 15:10:25
    文章目录一:shell函数1.1:函数定义的简化写法1.2:函数的作用范围1.3:递归函数二:shell数组2.1:应用场景包括2.2:数组的描述2.3:数组定义方法2.3.1:到100数组2.3.2:创建1到100奇数组2.3.3:创建任意数字及...
  • Shell函数(函数定义、函数调用)函数函数调用函数例题特殊的函数调用 函数 Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。 语法结构: ...
  • linux(十一)—shell 函数的定义和使用

    千次阅读 2021-11-13 09:39:17
    1:函数的作用:讲一段可重复使用的一段指令的集合放置在一个方法体中 让脚本中其他指令调用 2:函数定义格式: 格式1:函数名() { ........函数体 } 格式2:function 函数名() {......函数体.......} 3:...
  • Shell函数传递参数

    千次阅读 2019-09-27 11:48:12
    Shell函数传递参数 文章目录Shell函数传递参数背景错误用法解决办法思考提取变量,不加引号提取变量,加引号结论透过现象看本质 背景 函数之间调用时,如果把$@ (全部参数,可以用shift进行截断) 直接全部传递过去可能会...
  • day5shell函数和数组shell编程.txt
  • 一、Shell函数 本教程目前为止所有脚本都是从头到尾执行。这样做很好,但你也许已经注意到有些脚本段间互相重复。 shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。 shell中函数的定义格式如下: ...
  • shell函数的使用方法,轻松写脚本

    千次阅读 2022-04-14 01:46:18
    目录shell函数1.函数的作用2.函数的基本格式3.函数注意事项4.函数调用的方法5.函数的返回值6.函数的传参7.在外部调用函数8.函数变量的作用范围9.函数的递归 shell函数 1.函数的作用 语句块定义成函数约等于别名,...
  • linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。下面说说它的定义方法,以及调用需要注意那些事项
  • 【Bash百宝箱】shell函数

    千次阅读 2016-09-14 09:34:18
    1、基本格式shell函数的格式如下:name () compound-command [redirection] function name [()] compound-command [redirection]shell函数实际上就是一个简单的shell命令,在当前shell执行,它代表了一组复合命令...
  • shell脚本的学习过程中,遇到定义一个带有return语句的函数,来计算两数之和,代码如下: #!/bin/bash funWithReturn(){ echo "这个函数会对输入的数字进行相加运算" echo "输入第一个数字:" read num1 echo...
  • 主要介绍了Shell脚本中使用function(函数)示例,本文着重讲解的是如何在shell脚本中使用自定义函数,并给出了两个例子,需要的朋友可以参考下
  • 写了个shell函数 调用完之后不知道怎么获取返回值,于是乎用上了 $(func_name) 来获取,然后踩了几个坑 查看教程之后发现要用 $? 来获取刚刚执行的函数的返回值, function func1() { echo 1 return 2 echo 3 } ...
  • Shell 函数 递归

    千次阅读 2018-12-07 01:01:09
    函数:(就是一个功能。) 定义函数:描述一个功能的过程 [function] 函数名() { command1 … } 调用函数:执行一次函数 函数名 传递实参给函数函数名 实参1 实参2 实参3 … 函数中接收实参: $1 $2 $3 $4… $# ...
  • 带空格的字符串,比如变量time=“2020-06-28 13:00:00",不能直接写 func $time,这样传递过去后,在func函数体中,time会因为空格被拆开,变成 $1是2020-06-28,$2是13:00:00。正确的方式是:func" $time 返回值: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 721,355
精华内容 288,542
关键字:

shell函数

友情链接: Debug.rar