Bash关联数组排序

cos*_*_ck 6 arrays bash shell associative-array

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

./foo.py -k "${!args[@]}" -v "${args[@]}"
Run Code Online (Sandbox Code Playgroud)

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

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

小智 0

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

./foo.py -k key1,key2,key3 -v val1,val2,val3
Run Code Online (Sandbox Code Playgroud)

那么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
Run Code Online (Sandbox Code Playgroud)

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