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

如何通过nameref属性将多个数组作为参数传递给Bash脚本?

Bash脚本接收外部数组参数的可行方案

问题本质

直接运行独立脚本时,脚本会启动新的Bash子进程,父Shell里定义的变量默认不会被继承,所以你用declare -n尝试引用父进程的数组变量名时,子进程找不到对应的变量,自然无法生效。

方案一:用source执行脚本(推荐,简单直接)

让脚本在当前Shell进程内执行,而非启动子进程,这样就能直接使用nameref引用父Shell的数组。

父Shell操作:

declare -a array_1=( "on" "/path/to/me" "123" )
declare -a array_2=( "Green" "Red" )
# 用source代替直接运行脚本
source ./funct.sh array_1 array_2

funct.sh脚本内容:

#!/bin/bash
local -n a1=$1
local -n a2=$2

for i in "${a1[@]}"; do
    echo "$i"
done

for i in "${a2[@]}"; do
    echo "$i"
done

方案二:传递数组序列化内容

把数组内容序列化为安全的字符串传递给脚本,脚本再反序列化为数组。注意eval需在可控场景下使用,避免注入风险。

父Shell操作:

declare -a array_1=( "on" "/path/to/me" "123" )
declare -a array_2=( "Green" "Red" )
# 序列化数组为字符串传递
./funct.sh "$(printf "%q " "${array_1[@]}")" "$(printf "%q " "${array_2[@]}")"

funct.sh脚本内容:

#!/bin/bash
# 反序列化参数为数组
eval "a1=($1)"
eval "a2=($2)"

for i in "${a1[@]}"; do
    echo "$i"
done

for i in "${a2[@]}"; do
    echo "$i"
done

方案三:通过临时文件传递变量定义

先把父Shell的数组变量导出到临时文件,脚本再导入这些变量,之后用nameref引用。

父Shell操作:

declare -a array_1=( "on" "/path/to/me" "123" )
declare -a array_2=( "Green" "Red" )
# 导出变量定义到临时文件
export -p array_1 array_2 > ./tmp_array_vars.sh
./funct.sh array_1 array_2
# 用完删除临时文件
rm ./tmp_array_vars.sh

funct.sh脚本内容:

#!/bin/bash
# 导入父进程的变量定义
source ./tmp_array_vars.sh

local -n a1=$1
local -n a2=$2

for i in "${a1[@]}"; do
    echo "$i"
done

for i in "${a2[@]}"; do
    echo "$i"
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:47:17