我可以将 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
循环的第二次迭代会是什么?
试试这个代码:
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
有关的:
我觉得 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?
如果你不能回答,我也一样。这通常意味着你想得太复杂了。我认为更简单的我上面的版本没有以非常自然的方式有这个角落,因为它的不同之处在于最后一次迭代“缺失”。
没有(实用的)方法可以监视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