gpt4 book ai didi

bash - 通过引用传递参数

转载 作者:行者123 更新时间:2023-11-29 08:41:29 24 4
gpt4 key购买 nike

我想问一下是否可以通过引用将参数传递给脚本函数:

即做一些在 C++ 中看起来像这样的事情:

void boo(int &myint) { myint = 5; }

int main() {
int t = 4;
printf("%d\n", t); // t->4
boo(t);
printf("%d\n", t); // t->5
}

那么在 BASH 中我想做类似的事情:

function boo () 
{

var1=$1 # now var1 is global to the script but using it outside
# this function makes me lose encapsulation

local var2=$1 # so i should use a local variable ... but how to pass it back?

var2='new' # only changes the local copy
#$1='new' this is wrong of course ...
# ${!1}='new' # can i somehow use indirect reference?
}

# call boo
SOME_VAR='old'
echo $SOME_VAR # -> old
boo "$SOME_VAR"
echo $SOME_VAR # -> new

如有任何想法,我们将不胜感激。

最佳答案

现在是 2018 年,这个问题值得更新。至少在 Bash 中,从 Bash 4.3-alpha 开始,您可以使用 namerefs 通过引用传递函数参数:

function boo() 
{
local -n ref=$1
ref='new'
}

SOME_VAR='old'
echo $SOME_VAR # -> old
boo SOME_VAR
echo $SOME_VAR # -> new

这里的关键部分是:

  • 将变量名传递给 boo,而不是它的值: boo SOME_VAR ,不是 boo $SOME_VAR .

  • 在函数内部,使用 local -n ref=$1 $1 命名的变量声明一个 nameref ,这意味着它不是对 $1 的引用本身,而是一个名字的变量$1成立,即 SOME_VAR在我们的例子中。右侧的值应该只是一个命名现有变量的字符串:如何获取字符串并不重要,所以像 local -n ref="my_var" 这样的东西或 local -n ref=$(get_var_name)也会工作。 declare也可以替换 local在允许/要求的情况下。参见 chapter on Shell Parameters in Bash Reference Manual了解更多信息。

这种方法的优点(可以说)是更好的可读性,最重要的是,避免了 eval ,其安全隐患很多且有据可查。

关于bash - 通过引用传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/540298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com