回答:
の非常に用途の広いバージョンには、do ... while
次の構造があります。
while
Commands ...
do :; done
例は次のとおりです。
#i=16
while
echo "this command is executed at least once $i"
: ${start=$i} # capture the starting value of i
# some other commands # needed for the loop
(( ++i < 20 )) # Place the loop ending test here.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "
そのまま(値が設定されていないi
)ループは20回実行されます。16 に
設定i
する行のコメントを解除するi=16
と、ループが4回実行されます。、i=16
i=17
i=18
とi=19
。
iが同じポイント(開始)で(たとえば26)に設定されている場合、コマンドは(ループブレークコマンドがテストされるまで)初めて実行されます。
しばらくの間、テストは真実でなければなりません(終了ステータス0)。
untilループの場合は、テストを逆にする必要があります。つまり、偽りです(終了ステータスが0ではありません)。
POSIXバージョンでは、動作するように変更されたいくつかの要素が必要です。
i=16
while
echo "this command is executed at least once $i"
: ${start=$i} # capture the starting value of i
# some other commands # needed for the loop
i="$((i+1))" # increment the variable of the loop.
[ "$i" -lt 20 ] # test the limit of the loop.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "
./script.sh
this command is executed at least once 16
this command is executed at least once 17
this command is executed at least once 18
this command is executed at least once 19
Final value of 20///16
The loop was executed 4 times
set -e
while条件ブロック内で失敗したものを使用しても実行が停止しないことを忘れないでください。例set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done
-> shitが発生します。したがって、これを使用する場合は、エラー処理に非常に注意する必要があります。つまり、すべてのコマンドを&&
!
do ... whileまたはdo ... untilループはありませんが、次のように同じことが実現できます。
while true; do
...
condition || break
done
まで:
until false; do
...
condition && break
done