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
}
我有两个数组,一个是用户名,另一个是全名,它们实际上是由 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
}