shell 转移数组索引,想只增加数组数据的索引到另一个数组

weylhg0b  于 2023-08-07  发布在  Shell
关注(0)|答案(3)|浏览(85)

我有一个bash脚本,里面有一个这样的数组。

#!/bin/bash

declare -A data
declare -A dataindex

data[food0]='pasta'
data[food1]='orange'
data[drink0]='water'
data[drink1]='juice'

for ((i=0;i<=${#data[@]};i++))
do
$dataindex[$i]=${!data}
done

echo dataindex

字符串
我想只增加数组数据的索引到另一个数组中。
这是一种简化的方法来表示我的项目的一部分,我正在开发一种方法来过滤基于数组索引的值,我开发了一些逻辑方法来做到这一点。。如果有人知道这件事,我会很高兴。
预期产量

food0 food1 drink0 drink1

csbfibhn

csbfibhn1#

听起来你不应该使用shell数组,而应该使用像awk这样的文本处理工具。
我不知道你到底想在代码中做什么,或者你想做什么,所以这里有一个在shell脚本中调用的awk脚本,它只是打印数组中的索引和关联值,这样你就可以对它们做任何你喜欢的事情:

$ cat tst.sh
#!/usr/bin/env bash

awk '
    BEGIN {
        data["food0"]  = "pasta"
        data["food1"]  = "orange"
        data["drink0"] = "water"
        data["drink1"] = "juice"

        for ( idx in data ) {
            val = data[idx]
            print "idx=" idx, "val=" val
        }
    }
' "${@:--}"

字符串

$ ./tst.sh
idx=drink0 val=water
idx=drink1 val=juice
idx=food0 val=pasta
idx=food1 val=orange


还可以考虑其他可能的方法来处理数组索引和值,例如:

$ cat tst.sh
#!/usr/bin/env bash

awk '
    BEGIN {
        split("food0 food1 drink0 drink1",idxs)
        split("pasta orange water juice",vals)
        for ( i in idxs ) {
            idx = idxs[i]
            val = vals[i]
            data[idx] = val
        }

        for ( i in idxs ) {
            printf "idxs[%s]=%s\n", i, idxs[i]
        }

        print ""

        for ( i in vals ) {
            printf "vals[%s]=%s\n", i, vals[i]
        }

        print ""

        for ( idx in data ) {
            printf "data[%s]=%s\n", idx, data[idx]
        }
    }
' "${@:--}"

$ ./tst.sh
idxs[1]=food0
idxs[2]=food1
idxs[3]=drink0
idxs[4]=drink1

vals[1]=pasta
vals[2]=orange
vals[3]=water
vals[4]=juice

data[drink0]=water
data[drink1]=juice
data[food0]=pasta
data[food1]=orange

pgx2nnw8

pgx2nnw82#

在bash中,它是一行程序:

declare -a dataindex=( "${!data[@]}" )

字符串
检查变量:

$ declare -p data dataindex
declare -A data=([drink1]="juice" [drink0]="water" [food1]="orange" [food0]="pasta" )
declare -a dataindex=([0]="drink1" [1]="drink0" [2]="food1" [3]="food0")


请注意索引的顺序:关联数组是无序的。

vshtjzan

vshtjzan3#

已解决,更改为…

for i in ${!data[@]}; do
dataindex=$i
done

字符串

相关问题