1.总结:三种方法
- 全局变量
- 命令替换
- 函数传参+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.三种方法对比
- 全局变量:最为简单,但是全局变量多了容易导致很难发现的bug,且代码很难维护
- 命令替换:使用echo就好了,推荐
- 函数传参+eval:要使用eval命令,比命令替换稍微复杂
5.整个脚本
#!/bin/bash
# fucntion里的return语句只能设置 status(0-success,非0-失败),exit语句也要指定status
# 如果function里没有return语句就是function最后一个语句得执行status
# 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}"