Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 将关联数组作为参数传递给Bash_Linux_Bash_Shell - Fatal编程技术网

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

Linux 将关联数组作为参数传递给Bash,linux,bash,shell,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

将关联数组作为参数传递给函数以避免重复遍历多个关联数组的最佳方法是什么?这样我就可以给函数提供我选择的任何数组来打印。以下是我所拥有的:

# 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
使用规则数组已经够难看的了,使用关联数组很困难——我没有找到一种方法来迭代键

我想知道你所需要的是不是
声明-p

print_array() { declare -p $1; }
print_array weapons
或者,更漂亮:

print_array() { declare -p $1 | sed 's/[[)]/\n&/g'; }
print_array weapons

我认为不能将关联数组作为参数传递给函数。不过,您可以使用以下方法绕过此问题:

#!/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)" 
输出

Imperial Sword ==> 90   
Tainted Dagger ==> 54   
Edged Shuriken ==> 25   
Straight Sword ==> 75   

您可以使用
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

我知道我没有发疯,这对我来说是一个艰难的时刻。你能解释一下sed是怎么回事吗?@Dford.py每当它看到
[
字符,
&
将插入匹配项,
[
回到新行。啊,我明白了。我必须参考我的sed手册,并选择更多的正则表达式。有没有一种方法可以在不使用大括号、大括号和引号的情况下打印它?换句话说,就是按@JS打印웃@Dford.py取决于您希望看到的输出内容,您可以将它传输到另一个
sed
类似的东西:
declare-p-wearms | sed的/[[])]/\n&/g'| sed的/[:punct:]///g
这是我在一篇文章中看到的内容,这可能是最好的选择。我非常感谢您的帮助!看起来这是复制的(然后稍加编辑)from;请注意,扩展
${1}*=}
周围的双引号修复了空白问题(如原始答案中所述)。您是否查看了?local-n选项在GNU bash版本4.2.46(1)-发行版(x86_64-redhat-linux-GNU)上不起作用:
local:-n:invalid option
@draw:它是在4.3中添加的;请参阅(它没有明确列出
local
,但
local
处理的类型与
declare
相同)4.3是在2014-02年发布的,尽管发行版不会立即获取新版本,这很神奇。它不会将数组键传递给函数……以下是你可以毫无问题地传递键的选项:我添加了一条注释示例对我有用。例如,
fun${dict[ke]}
生成输出
va
。我想如果您想将其用作
fun ke
,那么您必须以某种方式将数组的名称传递给函数,或者使用可以硬编码的“定义良好”数组名称(但我想这很难看)。祝大家好运。你是什么意思?@shellterI同意你的帖子;-?…但我添加了一条评论,说一些用户可能很懒,希望只传递关键文本,即
fun ke
以获得返回的值
va
。但如果这是他们的目标,他们将不得不增强你的功能。祝大家好运!
Imperial Sword ==> 90   
Tainted Dagger ==> 54   
Edged Shuriken ==> 25   
Straight Sword ==> 75   
 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
#!/bin/bash

   declare -A dict
   
   dict=(
    [ke]="va"
    [ys]="lu"
    [ye]="es" 
   ) 
   
   fun() {
     for i in $@; do
       echo $i
     done
    }
   
   fun ${dict[@]} 

# ||${dict[key]} || ${!dict[@]} || ${dict[$1]} || ${dict[@]}