ループカウンタリセット

ループカウンタリセット

簡単な質問: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
}

しかし。

関連情報