我有一个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。
答案 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}})。