如何在不创建子shell的情况下从shell脚本中的函数调用返回值?

时间:2017-02-17 02:09:49

标签: bash shell

我有一个shell函数,它访问并触及一个全局数组,它基本上是一个缓存。它通过回显它返回值:

declare -A cache

function get_value() {
    if [ ${cache[$1]+exists} ]; then
        echo ${cache[$1]}
    else
        value=$(create_value $1) # want to cache this result
        cache[$1]="${value}"
        echo $value
    fi
}

如果我以标准方式称呼它

myValue=$( get_value "foo" )

它不起作用,因为函数中的cache[]更新发生在子shell($( ... ))中,并在返回脚本也称为父shell时丢失。

我唯一能想到的是使用全局变量(result)作为返回值,但当然在结构化编程方面并不是那么好:

declare -A cache

function get_value() {
    if [ ${cache[$1]+exists} ]; then
        result=${cache[$1]}
    else
        value=$(create_value $1) # want to cache this result
        cache[$1]="${value}"
        result=$value
    fi
}

get_value "foo"
myValue=$result

有更好的选择吗?

使用Bash 4.2.45。

1 个答案:

答案 0 :(得分:2)

您可以将要将结果作为参数分配到的变量名称传递给函数,并使用printf -v执行分配:

declare -A cache

function get_value() {
    if [ ${cache[$1]+exists} ]; then
        printf -v "$2" "${cache[$1]}"
    else
        local value=$(create_value "$1") # want to cache this result
        cache[$1]="$value"
        printf -v "$2" "$value"
    fi
}

get_value "foo" my_value

如果您要控制变量范围,您也可以将value变量设为本地变量,为什么不变量,使某种main()函数将所有变量保持为局部变量(甚至是cache 1}})。