Bash本身并不直接支持从函数中返回数组。但是,我们可以使用巧妙的技术来实现这一点。本文探讨了两种有效的方法:使用命令替换和操作内部字段分隔符 (IFS)。
目录
命令替换
命令替换捕获命令的输出并将其赋给一个变量。这是我们第一种方法的基础。关键是将函数的输出格式化,以便轻松解析回数组。
使用命令替换返回数组
此方法涉及使用分隔符将数组元素连接成字符串,然后将字符串再分割回数组。让我们来看一个例子:
my_array_function() {
local array=("apple" "banana" "cherry")
local delimiter="|"
echo "${array[*]}" | tr ' ' 'n' | paste -sd"$delimiter" -
}
returned_string=$(my_array_function)
returned_array=(${returned_string//|$delimiter/ })
echo "Returned array: ${returned_array[@]}"
工作原理如下:
my_array_function
创建一个局部数组。- 它使用
echo
、tr
将空格替换为换行符,并使用paste
使用分隔符连接元素。 - 命令替换将输出捕获到
returned_string
中。 - 参数扩展将分隔符替换为空格以创建数组
returned_array
。
这种方法简单有效,但分隔符不能出现在数组元素中。如果出现,请考虑使用不太常见的字符或更强大的分隔符处理方法。
使用IFS返回数组
内部字段分隔符 (IFS) 控制 Bash 如何将字符串分割成单词。我们可以利用这一点通过在函数内设置 IFS 并打印数组元素来返回数组。调用脚本然后使用修改后的 IFS 来解析输出。
my_array_function() {
local array=("apple" "banana" "cherry")
local old_ifs="$IFS"
IFS=$'n'
printf "%sn" "${array[@]}"
IFS="$old_ifs"
}
returned_array=($(my_array_function))
echo "Returned array: ${returned_array[@]}"
解释:
my_array_function
保存当前的 IFS。- 它将 IFS 设置为换行符。
- 它在新的一行打印每个数组元素。
- 它恢复 IFS。
- 调用脚本使用换行符作为分隔符来创建数组。
如果您的数组元素不包含换行符,此方法更简洁。对于包含换行符的元素,您需要选择一个不同的、不太可能出现的 IFS 字符。
选择最佳方法
两种方法都提供了可行的解决方案。最佳选择取决于您的具体需求和数组内容。命令替换方法提供了更灵活的分隔符选择,而如果您的数据允许,使用 IFS 会更简洁。始终优先考虑简洁、健壮且注释良好的代码。