我需要用 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\n可以使用声明或本地内置命令(请参阅 Bash 内置命令)的 -n 选项为变量分配 nameref 属性,以创建 nameref 或对另一个变量的引用。这允许间接操纵变量。每当 nameref 变量被引用、赋值、取消设置或修改其属性时(除了使用或更改 nameref 属性本身),操作实际上是对 nameref 变量\xe2\x80\x99s 值指定的变量执行。nameref 通常在 shell 函数中使用来引用其名称作为参数传递给函数的变量。例如,如果将变量名作为第一个参数传递给 shell 函数,则运行
\nRun Code Online (Sandbox Code Playgroud)\ndeclare -n ref=$1\n函数内部创建一个 nameref 变量 ref,其值是作为第一个参数传递的变量名。对 ref 的引用和赋值以及对其属性的更改均被视为对名称作为 $1 传递的变量的引用、赋值和属性修改。
\n
例如,像这样:
\ndeclare -n ref=$1\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n它真的很复杂、脆弱,而且不值得付出努力。请改用真正的脚本语言。
\n在 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 语言使启动外部程序变得容易,但处理数据结构却困难得多。
| 归档时间: |
|
| 查看次数: |
8233 次 |
| 最近记录: |