如何使用 bash 创建多维数组或类似的数组?

San*_*ago 9 bash array

我需要用 bash 创建一个多维数组,我读到 bash 中没有多维数组之类的东西。

这是我可能的数据,它们是什么样的以及我需要什么。这不是 bash 数组:

DATACOL = [
    "1"=>("Santiago","Barcelona","AWG","6792992","Male"),
    "2"=>("Santi","Texas","BGG","6792992","Male"),
    "3"=>("Tiago","Rio","GHA","6792992","Female") 
]
Run Code Online (Sandbox Code Playgroud)

我怎样才能用一个简单的脚本做类似的事情?我对 bash 完全是个新手。

ter*_*don 28

你不知道。如果您发现自己需要诸如多维数组之类的东西,则强烈表明您应该使用实际的编程语言而不是 shell。Shell 并不是真正的编程语言,尽管它们可以(滥用)用作一种语言,但这应该只用于简单的事情。不幸的是,许多人似乎认为 shell 是适用于所有情况的正确工具,这会导致浪费大量精力尝试做 shell 无法完成或可能做得非常糟糕的事情,而不是使用专为特定情况设计的工具。工作。

\n

也就是说,您可以使用namerefs将一些东西组合在一起:

\n
\n

可以使用声明或本地内置命令(请参阅 Bash 内置命令)的 -n 选项为变量分配 nameref 属性,以创建 nameref 或对另一个变量的引用。这允许间接操纵变量。每当 nameref 变量被引用、赋值、取消设置或修改其属性时(除了使用或更改 nameref 属性本身),操作实际上是对 nameref 变量\xe2\x80\x99s 值指定的变量执行。nameref 通常在 shell 函数中使用来引用其名称作为参数传递给函数的变量。例如,如果将变量名作为第一个参数传递给 shell 函数,则运行

\n
declare -n ref=$1\n
Run Code Online (Sandbox Code Playgroud)\n

函数内部创建一个 nameref 变量 ref,其值是作为第一个参数传递的变量名。对 ref 的引用和赋值以及对其属性的更改均被视为对名称作为 $1 传递的变量的引用、赋值和属性修改。

\n
\n

例如,像这样:

\n
declare -n ref=$1\n
Run Code Online (Sandbox Code Playgroud)\n

其产生:

\n
#!/bin/bash\n\ndata1=("Santiago" "Barcelona" "AWG" "6792992" "Male")\ndata2=("Santi" "Texas" "BGG" "6792992" "Male")\ndata3=("Tiago" "Rio" "GHA" "6792992" "Female")\n\ndatacol=("data1" "data2" "data3")\n\nfor arrayName in "${datacol[@]}"; do\n  declare -n array="$arrayName"\n  echo "The second element of the array \'$arrayName\' is: ${array[1]}"\ndone\n
Run Code Online (Sandbox Code Playgroud)\n

它真的很复杂、脆弱,而且不值得付出努力。请改用真正的脚本语言。

\n


ilk*_*chu 7

在 Bash 中你做不到,没有技巧的话。不过,Ksh93 确实具有本机多维数组。

一种常见的技巧是使用关联数组 ( declare -A arr),并使用 , 之类的键1,2,多个索引之间用逗号分隔。尽管迭代单个“行”或“列”并不那么简单。这也是 AWK 实现多维数组的方式,请参见GNU AWK 手册等。

以克什为单位:

arr=((a b c) (d e f))       # 3x2
arr[2]=(g h i)              # one more row
arr[0][2]=x                 # change a value
typeset -p arr
echo ---
for i in ${!arr[@]}; do     # ${!arr[@]} gives the indexes
   for j in ${!arr[i][@]}; do
      echo -n "${arr[i][j]} ";
   done;
   echo;
done
Run Code Online (Sandbox Code Playgroud)

印刷

typeset -a arr=((a b x) (d e f) (g h i) )
---
a b x 
d e f 
g h i 
Run Code Online (Sandbox Code Playgroud)

但实际上,这是您可能应该考虑改用 Python(或 Perl,或...)的情况之一,除非您的用例非常特殊。shell 语言使启动外部程序变得容易,但处理数据结构却困难得多。