0

我可以将 for 循环中的 args 列表视为列表吗?我可以使用列表索引访问列表中的元素吗?让这个伪代码运行:

#!/bin/bash
for i in 1 2; do
    j=the next element in the for loop
    echo current is $i and next is $j
done

输出应该是第一次迭代:

当前为 1,下一个为 2

循环的第二次迭代会是什么?

4

3 回答 3

3

试试这个代码:

declare -a data=(1 2)

for (( i = 0 ; i < ${#data[@]} ; i++ )) do
    elem=${data[$i]}
    j=$((i+1))
    nextElem=${data[$j]}
    echo current is $i $elem and next is $j $nextElem
done

有关的:

于 2012-07-12T08:55:02.407 回答
3

我觉得 bash 的人总是追求最复杂的事情。你也可以忍受:

# Let's say we want to access elements 1,3,3,7 in this order
cur=$1
for next in "$3" "$3" "$7"
do
    printf "cur: %s, next: %s\n" "$cur" "$next"
    cur=$next
done

What will it be for thesecondlast iteration of the loop?

如果你不能回答,我也一样。这通常意味着你想得太复杂了。我认为更简单的我上面的版本没有以非常自然的方式有这个角落,因为它的不同之处在于最后一次迭代“缺失”。

于 2012-07-12T10:10:40.490 回答
1

没有(实用的)方法可以监视for循环中的下一个元素是什么。您必须将值存储在其他地方和/或使用不同类型的循环。

您可以使用位置参数或数组。

位置参数保证不稀疏。

set -- {a..f}
n=1

while ((n<=$#)); do
    printf 'cur: %s%.s%s\n' "${!n}" $((++n)) ${!n:+", next: ${!n}"}
done

Bash 数组是稀疏的。如果您不直接使用for循环迭代值,则应该使用索引。

arr=({a..f}) idx=("${!arr[@]}")

while ((n<${#idx[@]})); do
    printf 'cur: %s%s\n' "${arr[idx[n]]}" ${idx[++n]:+", next: ${arr[idx[n]]}"}
done

即使您认为可以保证连续的元素,这种方法也不是一个坏主意。

两个示例的输出:

cur: a, next: b
cur: b, next: c
cur: c, next: d
cur: d, next: e
cur: e, next: f
cur: f
于 2012-07-12T09:56:52.483 回答