我需要用 bash 创建一个多维数组,我读到 bash 中没有多维数组这样的东西。
这是我可能的数据,它们看起来像什么以及我需要什么。这不是 bash 数组:
DATACOL = [
"1"=>("Santiago","Barcelona","AWG","6792992","Male"),
"2"=>("Santi","Texas","BGG","6792992","Male"),
"3"=>("Tiago","Rio","GHA","6792992","Female")
]
我怎样才能用一个简单的脚本做类似的事情?我是 bash 的新手。
你不知道。如果您发现自己需要多维数组之类的东西,这就强烈表明您应该使用实际的编程语言而不是 shell。Shell 并不是真正的编程语言,尽管它们可以作为一种(滥用)使用,但这应该只用于简单的事情。不幸的是,许多人似乎认为 shell 是适用于所有情况的正确工具,这导致大量的精力浪费在试图做一些 shell 不能做或做得非常糟糕的事情上,而不是使用专为工作。
也就是说,您可以使用namerefs将某些东西组合在一起:
例如,像这样:
哪个产生:
它真的很复杂,脆弱,不值得付出努力。请改用真正的脚本语言。
你不能在 Bash 中,不是没有技巧。不过,Ksh93 确实具有本机多维数组。
一个常见的技巧是使用关联数组 (
declare -A arr
),并使用 , 之类的键1,2
,多个索引由文字逗号分隔。尽管遍历单个“行”或“列”并不是那么简单。这也是 AWK 实现多维数组的方式,例如参见GNU AWK 手册。在 ksh 中:
印刷
但实际上,这是您可能应该考虑改用 Python(或 Perl 或...)的情况之一,除非您的用例非常特殊。shell 语言使启动外部程序变得容易,但处理数据结构要困难得多。
当然,在某些情况下,shell 脚本比 Python 或 Perl ...脚本更简单/更实用,例如当脚本充当输入源和后续处理之间的“粘合剂”时。
OP 没有提到他们想用这些数据做什么,所以下面是一些在 shell 脚本中处理键值数据的可能性的总结。我还假设输入中的字段是逗号分隔的(例如 en_US-locale *.csv 就是这种情况)。
可能性 #1:从输入文件中每行使用一个数组进行线性处理
可能性 #2:使用位置元素列表的线性处理,例如来自函数/程序的输入
可能性#3:将数据加载到多维数组中进行后续非线性处理
在这里,“维度分隔符”是一个点,但任何其他非数字字符也可以。可以使用未出现在任何维度名称中的任何字符(包括 $'\n'、$'\a' 等)。