bash 中是否有一个 array_combine 函数,我可以在其中从两个函数创建一个关联数组?

Is there in bash an array_combine function, where I can create an associative array from two?

我有两个数组,一个是用户名,另一个是全名,它们实际上是由 wbinfo -u.

动态生成的
USR=(user1 user2 user3)
FULL=("full user 1" "full user 2" "full user 3")

我想创建一个关联数组,我可以将它与 pdbedit 一起使用,所以在循环中我会 create/modify 用户名和全名(在 PHP 使用 array_combine).

会很容易
pdbedit -u $username -f $fullname

没有现成的array combine例程,但你可以这样作弊:

USR=(user1 user2 user3)
FULL=("full user 1" "full user 2" "full user 3")

declare -A arr
eval "$(paste -d= <(printf 'arr[%q]\n' "${USR[@]}") <(printf '%q\n' "${FULL[@]}"))

测试一下:

declare -p arr
declare -A arr='([user3]="full user 3" [user2]="full user 2" [user1]="full user 1" )'

您可以仅使用 bash 4.3 内置函数 (and no eval) 自行实现,如下所示:

combine() {
  declare key_no key val
  declare -n _keys= _vals= _dest=
  declare -g -A ""
  for key_no in "${!_keys[@]}"; do
    key=${_keys[$key_no]}
    val=${_vals[$key_no]}
    _dest[$key]=$val
  done
}

usr=(user1 user2 user3)
full=("full user 1" "full user 2" "full user 3")

combine usr full arr

此版本经历了一些额外的偏执,以正确处理稀疏数组。


如果您需要支持 4.3 之前的 bash 版本(最好是 4.3 系列后期版本,因为存在影响 namevar 支持的安全漏洞,可能导致 4.3 早期版本中的任意代码执行) , 那么下面的代码使用 declare 会更加谨慎(感谢 Glenn Jackman 在这里建议这个解决方案而不是之前的方法,它小心地使用 eval):

combine() {
  declare keys_var= vals_var= result_var=
  declare indirect i keys
  declare -gA "$result_var"

  indirect="${keys_var}[@]"; keys=( "${!indirect}" )
  for (( i=0; i < ${#keys[@]}; i++ )); do
    indirect="${vals_var}[$i]"; declare -g "${result_var}[${keys[i]}]=${!indirect}"
  done
}