do…whileまたはdo…までPOSIXシェルスクリプトで


16

よく知られているwhile condition; do ...; doneループがありdo... whileますが、ブロックの少なくとも1つの実行を保証するスタイルループはありますか?


ショーンに感謝します。答えがすぐに選択された答えになるとは思っていませんでした。だから:選択をありがとう。

回答:


15

の非常に用途の広いバージョンには、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=16i=17i=18i=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 -ewhile条件ブロック内で失敗したものを使用しても実行が停止しないことを忘れないでください。例set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done-> shitが発生します。したがって、これを使用する場合は、エラー処理に非常に注意する必要があります。つまり、すべてのコマンドを&&
ティモ

17

do ... whileまたはdo ... untilループはありませんが、次のように同じことが実現できます。

while true; do
  ...
  condition || break
done

まで:

until false; do
  ...
  condition && break
done

いずれかのループでブレークラインのいずれかを使用できます-trueまたはfalseまでは「永久」を意味します。私はそれが幸福な出口または悲しい出口の状態を持っている間、しばらくの間、またはいつまでも維持することを理解しています。
android.weasel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.