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

时间:2015-01-26 16:27:25

标签: arrays linux bash samba

我有两个数组,一个是用户名,另一个是全名,实际上是由 wbinfo -u 动态生成的。

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

我想创建一个关联数组,我可以将它与 pdbedit 一起使用,所以在循环中我会创建/修改用户名和全名(在PHP中使用{{3}很容易})。

pdbedit -u $username -f $fullname

2 个答案:

答案 0 :(得分:3)

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

combine() {
  declare key_no key val
  declare -n _keys=$1 _vals=$2 _dest=$3
  declare -g -A "$3"
  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=$1 vals_var=$2 result_var=$3
  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
}

答案 1 :(得分:2)

没有现成的数组合例程,但你可以这样欺骗它:

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" )'
相关问题