在Bash中:我可以将for循环中的args列表作为列表处理吗?

时间:2012-07-12 08:42:42

标签: bash for-loop arguments

我可以将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

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

3 个答案:

答案 0 :(得分: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

相关:

答案 1 :(得分: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 the <击> second last iteration of the loop?

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

答案 2 :(得分: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