Shell脚本中如何向函数传递多数组并在函数内访问
在Shell脚本中传递两个字符串数组给函数
这里给你两种实用的方法,适配不同的Bash版本场景:
方法1:用分隔符区分数组(兼容所有Bash版本)
Shell函数的参数是扁平化的,没法直接识别数组边界,所以可以在两个数组之间插一个不会出现在数组元素里的特殊标记,在函数内部拆分出两个数组。
示例代码:
#!/bin/bash # 处理数组的函数 process_two_arrays() { # 先收集第一个数组,直到碰到分隔符 local first_array=() while [[ "$1" != "__ARRAY_SPLIT__" ]]; do first_array+=("$1") shift done # 跳过分隔符 shift # 剩下的参数全部归为第二个数组 local second_array=("$@") # 验证:遍历输出第一个数组 echo "第一个数组的元素:" for item in "${first_array[@]}"; do echo "- $item" done # 验证:遍历输出第二个数组 echo -e "\n第二个数组的元素:" for item in "${second_array[@]}"; do echo "- $item" done } # 定义测试用的两个字符串数组 fruits=("apple" "banana" "cherry with space") colors=("red" "light yellow" "dark green") # 调用函数:展开第一个数组 + 分隔符 + 展开第二个数组 process_two_arrays "${fruits[@]}" "__ARRAY_SPLIT__" "${colors[@]}"
方法2:用命名引用(Bash 4.3及以上可用)
如果你的Bash版本够新(4.3+),可以用declare -n创建数组的引用,直接在函数里操作原数组,写法更简洁。
示例代码:
#!/bin/bash # 处理数组的函数 process_two_arrays() { # 创建两个数组的引用 declare -n arr1="$1" declare -n arr2="$2" # 验证输出 echo "第一个数组的元素:" for item in "${arr1[@]}"; do echo "- $item" done echo -e "\n第二个数组的元素:" for item in "${arr2[@]}"; do echo "- $item" done # 顺带提一句:这种方法可以直接修改原数组,比如给第一个数组加个元素 arr1+=("date") } # 定义测试数组 fruits=("apple" "banana" "cherry") colors=("red" "yellow" "green") # 调用函数:直接传数组名就行 process_two_arrays fruits colors # 查看原数组是否被修改 echo -e "\n修改后的第一个数组:" for item in "${fruits[@]}"; do echo "- $item" done
小提示
- 方法1的分隔符一定要选数组里绝对不会出现的字符串,避免拆分出错。
- 方法2虽然方便,但如果函数里不小心修改了引用数组,原数组也会跟着变,使用时注意。
内容的提问来源于stack exchange,提问作者Lucky
相关产品推荐
相关产品推荐

