如何同时获取数组的原序和逆序?

如何同时获取数组的原序和逆序?

所以,假设我有一个数组arr,其中有两个元素:

read -a arr <<< "$@"

然后我可以在函数或脚本中使用它并输入两个字符串或元素,如下所示:

read_me() {
read -a arr <<< "$@"
}
read_me "first test"

现在我已经知道如何获取数组的所有元素:

for i in "${arr[@]}"
do
    echo "$i" # where i do something with the respective element of said array.
done

但这只能使用将元素添加到前面提到的数组中的正常/原始顺序来完成...当然,我也知道如何以相反的顺序获取数组的元素:

indices=( ${!arr[@]} )
for ((i=${#indices[@]} - 1; i >= 0; i--)) ; do
    echo "${arr[indices[i]]}"
done

这两种方式都按预期工作。但问题是我需要正常顺序和相反顺序在同一个循环上。大多数情况下我不需要这样做:

echo "${arr[0]}" "${arr[1]}"
echo "${arr[1]}" "${arr[0]}"

我怎样才能在一个循环中做到这一点?

答案1

array=( 1 2 3 a b c )

for i in "${!array[@]}"; do
    j=$(( ${#array[@]} - i - 1 ))
    printf '%s\t%s\n' "${array[i]}" "${array[j]}"
done

输出:

1       c
2       b
3       a
a       3
b       2
c       1

简而言之,没有什么可以阻止您以任何顺序遍历数组,同时根据当前索引计算新索引并使用它。


在对该问题的评论中,有一条建议对于以下算术循环:

for (( i = 0, j = ${#array[@]} - 1; i < ${#array[@]}; ++i, --j ))
do
    printf '%s\t%s\n' "${array[i]}" "${array[j]}"
done

这利用了这样一个事实:逗号运算符可以用在循环头的初始化和更新部分来维护单独的循环变量。


根据您想要实现的目标以及实际的数组值,您也可以使用tac

$ paste <( printf '%s\n' "${array[@]}" ) <( printf '%s\n' "${array[@]}" | tac )
1       c
2       b
3       a
a       3
b       2
c       1

相关内容