如何通过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
相关产品推荐
相关产品推荐

