Bash Scripting

高效返回Bash函数中的数组

Spread the love

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[@]}"

工作原理如下:

  1. my_array_function 创建一个局部数组。
  2. 它使用echotr 将空格替换为换行符,并使用paste 使用分隔符连接元素。
  3. 命令替换将输出捕获到returned_string 中。
  4. 参数扩展将分隔符替换为空格以创建数组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[@]}"

解释:

  1. my_array_function 保存当前的 IFS。
  2. 它将 IFS 设置为换行符。
  3. 它在新的一行打印每个数组元素。
  4. 它恢复 IFS。
  5. 调用脚本使用换行符作为分隔符来创建数组。

如果您的数组元素不包含换行符,此方法更简洁。对于包含换行符的元素,您需要选择一个不同的、不太可能出现的 IFS 字符。

选择最佳方法

两种方法都提供了可行的解决方案。最佳选择取决于您的具体需求和数组内容。命令替换方法提供了更灵活的分隔符选择,而如果您的数据允许,使用 IFS 会更简洁。始终优先考虑简洁、健壮且注释良好的代码。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注