我可以将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
循环的第二次迭代会是什么?
答案 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