如何在 bash 中迭代列表(嵌套列表)的列表?

如何在 bash 中迭代列表(嵌套列表)的列表?

我有一个列表,例如:

data = [ ['a', 'b' ], ['a1', 'b1'], ['c1', 'd1' ] ]

我想同时迭代并访问每个嵌套列表的两个元素

就像是:

for elements in ??
do
    python3 main.py --argument1 elements[0] --arguments2 elements[1]
done

如何访问嵌套列表中的每个元素?

我已经尝试过这个:

a1=( a a1 c1 )
a2=( b b1 d1 )

declare -i i=0

while [ "${a1[i]}" -a "${a2[i]}" ]; do

    printf " %s  %s\n" "${a1[i]}" "${a2[i]}"
    ((i++))

done

exit 0

答案1

由于 中 不存在列表列表之类的东西bash,我们假设您想要在循环中成对地迭代两个列表,您的代码似乎也表明了这一点。此外,我们假设两个列表始终包含相同数量的元素,并且列表不稀疏。

您可以编写循环来使用索引或元素本身进行迭代。

以下示例说明如何循环其中一个数组的索引并使用它来访问两个数组中的元素。

a1=( a a1 c1 )
a2=( b b1 d1 )

for i in "${!a1[@]}"; do
        printf 'Pair: (%s,%s)\n' "${a1[i]}" "${a2[i]}"
done

该表达式"${!a1[@]}"将扩展为包含数组索引的列表a1

您还可以直接在循环中使用数组的元素。

a1=( a a1 c1 )
a2=( b b1 d1 )

set -- "${a1[@]}"

for b in "${a2[@]}"; do
        a=$1; shift
        printf 'Pair: (%s,%s)\n' "$a" "$b"
done

在这里,我们将位置参数列表设置为a1数组中的元素set,然后循环另一个数组的元素。该值是循环中$b的一个元素,并且是第一个位置参数(来自 的下一个元素)。该值被分配到位置参数列表,然后从位置参数列表中移出。a2$1a1$1a

上面的两段代码都会生成相同的输出。

Pair: (a,b)
Pair: (a1,b1)
Pair: (c1,d1)

您显示的代码的主要问题是,当您遇到空元素时,您不知道是否已到达数组的末尾。数组中必须允许有空元素。由于可能出现歧义,最好避免使用-ainside of语法,并将其替换为 with,并且您还应该测试 with是否为非空字符串。[ ... ][ ... ] && [ ... ]-n

答案2

当您更改 data 和 arrnum 时,您可以使用多维数组实现您的目的:

data=( a b a1 b1 c1 d1 )
arrnum=2
len=${#data[@]}

declare -i i=0

while [ "$len" -gt "$((i*arrnum))" ]; do

    for (( j=0; j<$arrnum-1; j++ )); do
    printf " %s  " "${data[i*arrnum+j]}"
    done
        printf " %s\n" "${data[i*arrnum+j]}"
    
    ((i++))

done

exit 0

结果 :

1

相关内容