如何得到linux脚本中函数的返回值?

1.总结:三种方法

  1. 全局变量
  2. 命令替换
  3. 函数传参+eval

2.第一种:全局变量

# 1.全局变量, 一个bash脚本内得所有变量都是默认全局变
# 但是大量使用全局变量可能导致难以发现的bug
function myfunc(){
    myresult='some value'
}
myfunc 
echo $myresult

3.第二种:命令替换

# 2.用函数内的local变量,问题就是如何从函数外获得这个函数内传递的值, command substitution
function myfuncLocal(){
    local mylocalresult='some local value'
    echo "$mylocalresult"
}

local_command_substituion_result=$(myfuncLocal) # or result=`myfuncLocal`
echo $local_command_substituion_result

3.第三种:函数传参+eval

# 3.写一个函数,然后把你想要作为返回值的变量作为参数传递给这个函数, 然后把函数结果设置到这个变量中
function myfuncwithparameterpass(){
    local __resultvar=$1
    local myresult='some value with paremeer passing'
    # 执行时其实 执行的的是  result='some value with paremeer passing'命令,会先解释$__resultvar
    eval $__resultvar="'$myresult'"
}
myfuncwithparameterpass result
echo $result

4.三种方法对比

  1. 全局变量:最为简单,但是全局变量多了容易导致很难发现的bug,且代码很难维护
  2. 命令替换:使用echo就好了,推荐
  3. 函数传参+eval:要使用eval命令,比命令替换稍微复杂

5.整个脚本

#!/bin/bash

# fucntion里的return语句只能设置 status(0-success,非0-失败),exit语句也要指定status
# 如果function里没有return语句就是function最后一个语句得执行status
# 1.bash function返回值得第一种方式就是 全局变量, 一个bash脚本内得所有变量都是默认全局变量,但是大量使用全局变量可能导致难以发现的bug

function myfunc(){
    myresult='some value'
}
myfunc 
echo $myresult

# 2.用函数内的local变量,问题就是如何从函数外获得这个函数内传递的值, command substitution

function myfuncLocal(){
    local mylocalresult='some local value'
    
    echo "$mylocalresult"
}
# 如果想要在字符串中用 变量 拼接 常量,则要用双引号括起来,单引号直接将${}当作字符解释,而不会执行命令
echo_str='test whether can output global variable myresult:${myresult}'
echo_str2="test whether can output global variable myresult:'xxx${myresult}'"
#echo 'test whether can output global variable myresult:${myresult}'
echo $echo_str
echo $echo_str2
local_command_substituion_result=$(myfuncLocal) # or result=`myfuncLocal`
echo $local_command_substituion_result
# 函数myfuncLocal内的local变量无法从外部访问
echo "mylocalresult:${mylocalresult}"

# 3.写一个函数,然后把你想要作为返回值的变量作为参数传递给这个函数, 然后把函数结果设置到这个变量中

function myfuncwithparameterpass(){
    local __resultvar=$1
    local myresult='some value with paremeer passing'
    # 执行时其实 执行的的是  result='some value with paremeer passing'命令,会先解释$__resultvar
    eval $__resultvar="'$myresult'"
}
myfuncwithparameterpass result
echo $result
# eval可以执行字符串代表的命令行
function testeval(){
    comamnd_str="echo eval command ${myresult}"
    eval $comamnd_str
}
testeval

# 3.1 注意内部的local变量名一定不能和外部传参使用的变量名一样,否则eval执行上述命令时,就只会修改local变量的值,导致无法修改到外部参数的值(返回值操作失败)
function sameparameterapass(){
    # result变量值是外部传参的名字 result
    local passamename=$1
    local myresult='same parameter passing'
    # 这里 $result就是 result, 注意本地存在一个变量名也是 result, 所以eval不会修改 从外面传进来的 result变量名了
    eval $passamename="'$myresult'"
}
sameparameterapass passamename
echo "sameparameterapass:${passamename}"

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值