Bash – 通过引用传递参数
发布时间:2020-12-15 19:56:08 所属栏目:安全 来源:网络整理
导读:我想询问是否可以通过引用传递脚本函数的参数: 即在C中做一些这样的事情: Void boo (int myint) { myint= 5; }main (){ int t= 4; printf t; // t-4 boo (t); printf t; // t -5} 那么在BASH我想做一些像: Function boo () { var1=$1 # now var1 is globa
我想询问是否可以通过引用传递脚本函数的参数:
即在C中做一些这样的事情: Void boo (int & myint) { myint= 5; } main (){ int t= 4; printf t; // t->4 boo (t); printf t; // t ->5 } 那么在BASH我想做一些像: Function boo () { var1=$1 # now var1 is global to the scrip but using it outside # this function makes me loose 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 任何想法都不胜感激。
使用助手功能upvar:
# Assign variable one scope above the caller. # Usage: local "$1" && upvar $1 value [value ...] # Param: $1 Variable name to assign value to # Param: $* Value(s) to assign. If multiple values,an array is # assigned,otherwise a single value is assigned. # NOTE: For assigning multiple variables,use 'upvars'. Do NOT # use multiple 'upvar' calls,since one 'upvar' call might # reassign a variable to be used by another 'upvar' call. # See: http://fvue.nl/wiki/Bash:_Passing_variables_by_reference upvar() { if unset -v "$1"; then # Unset & validate varname if (( $# == 2 )); then eval $1="$2" # Return single value else eval $1=("${@:2}") # Return array fi fi } 并在Newfun()中使用它: local "$1" && upvar $1 new 为了返回多个变量,请使用另一个帮助函数upvars。这允许在一个调用中传递多个变量,从而避免如果一个upvar调用更改另一个后续upvar调用中使用的变量的可能冲突。 请参阅:http://www.fvue.nl/wiki/Bash:_Passing_variables_by_reference for helper function upvars和更多信息。 问题在于: eval $1=new 是否如果$ 1碰巧包含一个命令是不安全的: set -- 'ls /;true' eval $1=new # Oops 最好使用printf -v: printf -v "$1" %s new 但是printf -v不能分配数组。 此外,如果变量恰好被声明为local,那么eval和printf都不会工作: g() { local b; eval $1=bar; } # WRONG g b # Conflicts with `local b' echo $b # b is empty unexpected 即使本地b未设置,冲突仍然存在: g() { local b; unset b; eval $1=bar; } # WRONG g b # Still conflicts with `local b' echo $b # b is empty unexpected (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |