shell 如何在bash中通过ref将参数传递给脚本

p4rjhz4m  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(119)

请注意,我说的是将参数通过引用传递给脚本,而不是函数。我已经检查了herehere,它们讨论了使用函数传递参数。
我想要的是调用一个脚本,向它传递一个参数,并使参数成为shell中的一个变量,并在脚本中赋值(这正是read RESPONSE命令所发生的情况,其中RESPONSE成为当前shell中的一个变量,并由read命令赋值)。
我知道使用这样的函数(使用local -n):

#!/bin/bash

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

SOME_VAR="old"
echo $SOME_VAR
boo SOME_VAR
echo $SOME_VAR

字符串
或者像这样(使用eval):

function booeval() {
  ref=$1
  eval $(echo $ref=\"new\")
}

SOME_VAR="old"
echo $SOME_VAR
booeval SOME_VAR
echo $SOME_VAR


工作如预期。但是local(或declare/typedef)不能在函数之外工作,而eval似乎运行在一个子shell中,当脚本结束时,变量在shell中无法生存。我想要这样的东西:

$ cat /tmp/test.sh
#!/bin/bash

ref=$1
eval $(echo "export $ref=\"new value\"")
$ /tmp/test.sh VAR
$ echo $VAR

$


有什么想法吗

72qzrwbm

72qzrwbm1#

您肯定知道,在子shell中分配的内容将保留在子shell中。
正如注解中所指出的,一种解决方案是没有子shell:如果脚本是source d,则将保留赋值。然而,这需要小心地编写脚本,以免产生不必要的副作用。
如果正常调用脚本(作为子shell),您可能能够解决复杂的IPC传递值的问题,但在我看来,您可以通过简单地让脚本输出值而不是试图将其分配给任何东西来完全绕过复杂性:

var=$(script)

字符串
您可以使用第一种方法 Package 它,以便可以传入变量名称:

assign_to(){
    local -n ref=$1
    shift
    ref=$("$@")
}


举例来说:

$ myref=myvar
$ assign_to $myref date +%Y
$ declare -p myvar
declare -- myvar="2023"
$

相关问题