繁体   English   中英

Bash关联数组排序

[英]Bash associative array ordering

如果我想分别在bash中传递关联数组的键和值,并使用类似的东西

./foo.py -k "${!args[@]}" -v "${args[@]}"

他们会以相同的顺序出现吗? 我真的不关心其他k = v对存储在哪里,但我确实需要知道我是否可以指望键和值出来,以便键数组中的第3项实际上是键的值数组中的第3项。

我知道关联数组是“无序的”,无论你将它们添加到数组中的顺序与它们的输出方式无关,但我想知道底层存储行为是否意味着它们总是以相同的顺序输出。

看来,答案是肯定的,键和值将始终以相同的顺序,根据我的Bash版本4.3,找到的代码assoc.c ,可在这里 数组的键和值分别由函数assoc_keys_to_word_listassoc_to_word_list检索。 这两个函数都委托给assoc_to_word_list_internal ,它在两种情况下都运行相同的循环,并且仅根据t参数区分要检索的项的类型(第482-503行):

 static WORD_LIST * assoc_to_word_list_internal (h, t) HASH_TABLE *h; int t; { WORD_LIST *list; int i; BUCKET_CONTENTS *tlist; char *w; if (h == 0 || assoc_empty (h)) return((WORD_LIST *)NULL); list = (WORD_LIST *)NULL; for (i = 0; i < h->nbuckets; i++) for (tlist = hash_items (i, h); tlist; tlist = tlist->next) { w = (t == 0) ? (char *)tlist->data : (char *)tlist->key; list = make_word_list (make_bare_word(w), list); } return (REVERSE_LIST(list, WORD_LIST *)); } 

如果您想知道, make_word_listarray.c/h定义。 它只是将新的WORD_LIST节点附加到现有链接列表。

虽然这没有提供合同保证,您期望的行为将始终得到支持,但这是一个非常好的迹象,表明您可以安全地使用您的呼叫约定,至少目前是这样。 关联数组仅使用Bash这一事实使得实现更像是一个有效的引用。

数组不是解决此问题的方法,尤其不是关联数组。 即使它们确实以相同的顺序出现,您也会有多个键用于单个-k选项,从而导致语法错误。 数组也是Bashism ,不是由POSIX定义的。 更好的解决方案是这样的:

./foo.py -k key1,key2,key3 -v val1,val2,val3

那么Python肯定可以拆分输入字符串吗? 我用POSIX shell做了类似的事情:

tr , '\n' > keys <<eof
$1
eof
tr , '\n' > vals <<eof
$2
eof
paste -d '\n' keys values |
while
  read key
  read val
do
  printf 'key: %s, val: %s\n' "$key" "$val"
done

当然,使用Python会更容易,因为您可以直接将字符串拆分为数组而不使用文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM