重置循环计数器

重置循环计数器

简单的问题:如果我for在不可靠的列表上有一个循环(zsh),我的意思是该列表包含无法事先预测的条目,那么我可以重置for循环计数器吗?这证明了我的要求:

# e.g. list=(1 5 2 9)
for i in $list ; do
    [[ $i = 2 ]] && i=${list[1]}
done

(如果这个例子有效的话,显然会永远循环。)

我只能想到这样做:

for ((j=1; j<=${#list}; j++)); do
    [[ ${list[$j]} = 2 ]] && j=1
done

有更简单的方法吗? (“更简单”意味着更容易用眼睛跟随你正在做的事情。)

答案1

你可以这样做:

alias   forever='while ((1))' \
      try-again='continue 2'  \
        ok-done='break'

forever {
  for i ("$list[@]") {
    (( i == 2 )) && try-again
  }
  ok-done
}

请注意,如果您不想省略空元素,则需要"$list[@]"而不是。$list

没有比以下更清晰的了:

for ((i = 1; i <= $#list; i++)) {
  (( list[i] == 2 )) && i=1
}

尽管。

相关内容