【问题标题】:function that returns an array in bash [duplicate]在bash中返回数组的函数[重复]
【发布时间】:2021-11-24 22:17:00
【问题描述】:

我有一个读取 csv 文件的 bash 函数,我希望该函数返回一个数组。我该怎么做?

我知道通常 bash 不会“返回对象”,但我想知道是否存在 hack 以便以下代码:

data=$(readFromCSV $file)

从自定义函数 readFromCSV 返回一个数组。 我的意思是 $data 是一个真正的数组,所以我可以运行

echo {#data[@]}

它会告诉我数组中有多少项。

你会如何告诉函数返回数组?

谢谢

【问题讨论】:

标签: arrays bash function return


【解决方案1】:

所以基本上这就是我如何继续模仿要从 csv 文件传递​​的“数组对象”。

首先,为 csv 创建函数:

function readFromCSV() {
    file=$1
    arr_csv=() 
    while IFS= read -r line 
    do
        arr_csv+=("$line")
    done < $file

    echo ${arr_csv[*]} # this will output a string
}

然后调用函数:

list=$(readFromCSV $file)

然后将字符串重新映射到数组:

arrayCSV=($list)

现在 arrayCSV 是来自 CSV 文件的值的数组。

【讨论】:

  • 在函数内部定义数组是没有意义的。如果您只是将每一行写入标准输出,您将获得完全相同的行为:while IFS= read -r line; do echo "$line"; done &lt; "$file"。
  • 回复:function funcName() {,参见 wiki.bash-hackers.org/scripting/obsolete——这以与旧版 ksh​​ 或 POSIX 不兼容的方式合并了旧版 ksh​​ 和 POSIX 语法。
  • ...至于手头的实际直接问题,这是没有充分理由的非常糟糕的代码。 Bash 4.3 namerefs 让您直接从函数内分配给调用者命名的数组。当你使用echo ${arr_csv[*]} 时,你首先就失去了使用数组的意义,因为你破坏了关于元素边界最初存储位置的信息。
  • 举个具体的例子,array=( "first element" "*" "third element" ) -- 现在当你string=$(echo ${array[*]}) 并使用newArray=( $string ) 时,你会得到newArray[0]="first",newArray[1]="element",第三个元素中的文件名列表, 等等;您已经丢失了 first element 曾经只是一个字符串的信息,并且 * 被引用了。
  • @chepner,不完全相同的行为 - 如果一个人只是一次将一行回显到标准输出,您可以使用 readarray 或 mapfile 构造一个具有正确边界的数组在外面,假设没有数组元素包含文字换行符(不是 100% 安全的假设,当然,这就是为什么 NUL 分隔符更好)。 OP在这里做的更糟;他们的echo 将所有内容放在一条线上。
猜你喜欢
  • 2019-10-20
  • 2023-03-30
  • 1970-01-01
  • 2017-07-22
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
相关资源
最近更新 更多