将关联数组作为参数传递给Bash

the*_*Fox 3 linux bash shell

将关联数组作为参数传递给函数以避免重复必须迭代多个关联数组的最佳方法是什么?这样我可以给函数任意打印的数组.这就是我所拥有的:

# Snippet

declare -A weapons=(
  ['Straight Sword']=75
  ['Tainted Dagger']=54
  ['Imperial Sword']=90
  ['Edged Shuriken']=25
)

print_weapons() {
  for i in "${!weapons[@]}"; do
    printf "%s\t%d\n" "$i" "${weapons[$i]}"
  done
}

print_weapons
Run Code Online (Sandbox Code Playgroud)

mug*_*896 12

你可以用作local -n参考

 declare -A weapons=(
 ['Straight Sword']=75
 ['Tainted Dagger']=54
 ['Imperial Sword']=90
 ['Edged Shuriken']=25
 )

 print_weapons() {
     local -n array=$1
     for i in "${!array[@]}"; do
         printf "%s\t%d\n" "$i" "${array[i]}"
     done
 }

 print_weapons weapons
Run Code Online (Sandbox Code Playgroud)


jay*_*ngh 5

我不认为你可以将关联数组作为参数传递给函数.您可以使用以下hack解决问题:

#!/bin/bash

declare -A weapons=(
  ['Straight Sword']=75
  ['Tainted Dagger']=54
  ['Imperial Sword']=90
  ['Edged Shuriken']=25
)

function print_array {
    eval "declare -A arg_array="${1#*=}
    for i in "${!arg_array[@]}"; do
       printf "%s\t%s\n" "$i ==> ${arg_array[$i]}"
    done
}

print_array "$(declare -p weapons)" 
Run Code Online (Sandbox Code Playgroud)

产量

Imperial Sword ==> 90   
Tainted Dagger ==> 54   
Edged Shuriken ==> 25   
Straight Sword ==> 75   
Run Code Online (Sandbox Code Playgroud)