我有两个数组,一个是用户名,另一个是全名,实际上是由 wbinfo -u 动态生成的。
USR=(user1 user2 user3)
FULL=("full user 1" "full user 2" "full user 3")
我想创建一个关联数组,我可以将它与 pdbedit 一起使用,所以在循环中我会创建/修改用户名和全名(在PHP中使用{{3}很容易})。
pdbedit -u $username -f $fullname
答案 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" )'