如何将列表分配给关联数组的值?

14

我想做的基本上就是将列表分配给关联数组的值。

#!/usr/local/bin/bash
declare -A params

params[n]=(200 400 600 800)
params[p]=(0.2 0.4)

但是我收到了这个错误:

line 4: params[n]: cannot assign list to array member
line 5: params[p]: cannot assign list to array member

有没有办法解决这个问题?


你所写的符号似乎试图将数组分配给数组值。虽然这在其他一些语言中有效,但在bash中无效。在bash中,数组成员不能是数组,只是一个字符串。如何绕过它取决于您想要实现什么。如果您能在问题中添加有关您的最终目标的提示,我们将更能够建议替代方案。 - ghoti
4个回答

19

基本上,您需要一个二维数组:

第一维由“n”或“p”引用。
第二维像普通数组一样引用。

bash不支持多维数组。

您可以使用以下选项之一:

  1. 在单个维度数组中使用组合索引作为数组索引。

declare -A params
params[n,0]=200
params[n,1]=400 
params[n,2]=600 
params[n,3]=800
params[p,0]=0.2
params[p,1]=0.4
  • 使用两级取消引用:

    declare -A params
    
    #Declare 2 normal arrays.
    array1=(200 400 600 800)
    array2=(0.2 0.4)
    
    #Use the main array to hold the names of these arrays.
    params[n]=array1[@]
    params[p]=array2[@]
    
    #use the array.
    printf "%s\n" "${!params[n]}"
    printf "%s\n" "${!params[p]}"
    
  • 好老的2个独立数组:

    param_n=(200 400 600 800)
    param_p=(0.2 0.4)
    
    使用这些方法,即使值包含空格,您也可以遍历数组。
  • 使用这些方法,您可以遍历包含空格的值的数组。


    6

    试试这个:

    declare -A params
    params=([n]="200 400 600 800" [p]="0.2 0.4")
    declare -p params
    

    输出:

    声明 -A params='([n]="200 400 600 800" [p]="0.2 0.4")'
    

    (注:这段代码是一个bash中的数组声明)

    3
    如果我这样写,以后能否遍历键和值? - mynameisJEFF

    5

    你是不是想将列表作为关联数组中的元素n和p进行存储?像这样:

    #!/bin/bash
    
    declare -A params
    
    params[n]="200 400 600 800"
    params[p]="0.2 0.4"
    
    for i in ${!params[@]}; do 
        echo "params[$i] = ${params[$i]}"
    done
    
    exit 0
    

    输出

    $ bash aalist.sh
    params[n] = 200 400 600 800
    params[p] = 0.2 0.4
    

    0
    大多数时候,我们想要多维数组是因为我们喜欢以这种方式“存储”数据并从中重新调用数据,但我们并没有专注于我们实际想要实现的目标。在许多情况下,并不需要使用多维数组来达到这个目标。
    Shell在这方面并不擅长。但是,如果你需要在Shell环境中解决这个问题,考虑使用函数和方法来解析多个单维数组,以达到相同的效果,但避免使用“伪”多维数组所带来的问题。特别是因为Shell脚本被设计为“助手”,当Shell或其系统更新时,你的伪解决方案可能无法正常工作。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接