Why don't Bash associative arrays maintain index order?

前端 未结 3 924
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-14 06:28

I\'m creating associative arrays to process in a for loop but i\'m getting some strange results in index order. Please take a look at this example script:

#!         


        
3条回答
  •  生来不讨喜
    2021-01-14 06:35

    According to comments this can be done to bypass this behavior.

    order=(d1 e2 m3 o4)
    declare -A test2=(
        [d1]=1w45
        [e2]=2dfg
        [m3]=3df
        [o4]=4df
    )
    for key in ${order[@]}; { echo $key ${test2[$key]}; }
    
    d1 1w45
    e2 2dfg
    m3 3df
    o4 4df
    

    Or that

    declare -A test3=(
        [order]="1d 2e 3m 4o"
        [1d]=1w45
        [2e]=2dfg
        [3m]=3df
        [4o]=4df
    )
    for key in ${test3[order]}; { echo $key ${test3[$key]}; }
    
    1d 1w45
    2e 2dfg
    3m 3df
    4o 4df
    

    Is there a better way?

    Update, according to accepted answer associative array isn't the right choice if you need a strict order in for loop, better use something like this:

    key=(d1   e2   m3  o4 ) 
    val=(1w45 2dfg 3df 4df)
    
    for i in ${!key[@]}; {
        echo ${key[$i]} ${val[$i]}
    }
    

    Or this

    key_val=(
        "d1 1w45"
        "e2 2dfg"
        "m3 3df"
        "o4 4df")  
    
    for item in "${key_val[@]}"; {
        sub=($item)
        echo ${sub[0]} ${sub[1]}
    }
    

    Or that

    keys=(d1      e2      m3     o4    )
          d1=1w45 e2=2dfg m3=3df o4=4df
    
    for key in ${keys[@]}; {
        echo $key ${!key}
    }
    

提交回复
热议问题