You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中向脚本按引用传递参数?

问题:向Shell脚本按引用传递参数,让脚本赋值当前Shell变量

请注意,我讨论的是向脚本按引用传递参数,而非向函数传递。我已查看过相关内容,它们仅讨论了向函数传递参数的情况。

我想要实现的是:调用脚本时传入一个参数,让该参数成为当前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

$

请问有什么解决思路?


解决思路

直接运行脚本会启动子Shell,子Shell内的变量无法影响父Shell,这是核心问题。要让脚本修改当前Shell的变量,必须让脚本在当前Shell进程内执行,而非子Shell。以下是三种实用方法:

方法1:用source或.执行脚本

把脚本内容加载到当前Shell中运行,而非启动子进程。修改调用方式即可:

$ source /tmp/test.sh VAR
# 或者用简写形式
$ . /tmp/test.sh VAR
$ echo $VAR
new value

这种方式下,脚本里的eval会直接在当前Shell生效,变量会被保留。

方法2:让脚本输出赋值命令,由当前Shelleval执行

修改脚本,让它输出变量赋值的命令,而不是直接执行。然后在调用时用eval捕获并执行这些命令:

修改后的/tmp/test.sh:

#!/bin/bash

ref=$1
echo "$ref='new value'"

调用方式:

$ eval "$(/tmp/test.sh VAR)"
$ echo $VAR
new value

这种方式下,脚本在子Shell中运行,但输出的赋值语句被父Shell的eval执行,从而修改父Shell的变量。

方法3:用函数封装脚本逻辑(兼容场景)

如果必须保持脚本独立,但又要影响当前Shell,可以把脚本的核心逻辑写成函数,然后用source加载脚本,再调用函数传递变量名:

修改后的/tmp/test.sh:

#!/bin/bash

set_var() {
  local -n ref=$1
  ref="new value"
}

调用方式:

$ source /tmp/test.sh
$ set_var VAR
$ echo $VAR
new value

内容的提问来源于stack exchange,提问作者Adriano_Pinaffo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:30:08