これはbashループの継続記事であり、前の記事でforループについて説明しました。 。この記事では、さらに2つのbashループ、つまり while
について見ていきます。 およびuntil
ループ。
while
ループは主に、ファイルの内容を読み取ってさらに処理する必要がある場合に使用されます。ファイルの読み取りと書き込みは、bashスクリプトを作成するときの一般的な操作です。 while
を使用してファイルを読み取る方法を説明します ループ。
リダイレクト演算子を使用してファイルに書き込む方法については、すでに非常に詳細な記事があります。
- 例を使用して説明されたBashリダイレクト
while
の機能 ループはfor
に似ています ループ。 for
ループはアイテムのリストを繰り返し処理し、コードブロックNを数回実行します。ここでwhile
ループでは、条件が最初に評価され、条件がtrueの場合、条件がfalseと評価されるまでコードのブロックが実行されます。
1。 whileループ
以下はwhile
です ループ構文。ループは"while"で始まります キーワードの後に、真であると評価する必要のある条件が続きます。 do
の間 およびdone
ブロックは、コードが配置される場所であり、N回繰り返されます。
while [[ condition ]] do Command 1 Command 2 .... Command 3 done
例1-評価と反復
以下の例を見てください。ここで、変数"NUM=5"
を作成しました と私の状態($NUM -ne 0
)は、変数NUM
の場合にループが実行されます ゼロに等しくありません。
$ NUM=5 while [[ $NUM -ne 0 ]] do printf "Value of NUM = $NUM \n" ((--NUM)) done

カウンターを使用する必要があります while
を操作するときに、変数に格納されている値をインクリメントまたはデクリメントします ループします。そうでない場合は、無限ループになり、NUM
常に5に設定されます。ここでは、NUM
の値をデクリメントしています。 ((--NUM))
を実行することによりすべての反復で 、だから私の変数NUM
はゼロに設定され、ループが終了します。
((++NUM)) → Increment NUM variable by 1, similar to running NUM=$(( $NUM + 1 )) ((--NUM)) → Decrement NUM variable by 1, similar to running NUM=$(( $NUM - 1 ))
例2-無限ループ
無限ループとは、条件が常にtrueと評価され、ループが終了しない場所です。
無限ループを作成するには、bash-builtin true
を使用できます。 キーワード。また、"sleep"
を使用します 無限ループをテストするときにコマンドを実行すると、スクリプトの停止を制御できます。そうしないと、画面が高速スクロール出力でいっぱいになります。
$ NUM=0 while true do printf "Value of NUM = $NUM \n" ((++NUM)) sleep 2 done

例3-内部フィールドセパレーター(IFS)
IFSは、単語の境界をどのように処理するかを決定する特別なシェル変数です。デフォルトでは、IFSはスペース、タブ、および改行文字に設定されています。ターミナルを開き、次のコマンドを実行します。
$ var1="foo:bar foo bar"
$ for val in $var1 do echo $val done

出力を見てください。 for
ループは文字列を反復処理しており、単語の境界を決定し、スペースをフィールド区切り文字と見なすのはIFSです。
次に、以下のコードを再度実行します。ここでは、IFSはコロンに設定されています 。
$ var1="foo:bar foo bar"
$ IFS=":"
$ for val in $var1 do echo $val done

上記の出力から、カスタムフィールド区切り文字のコロンが単語の境界として使用されていることがわかります。 unset
を実行すると、IFSをデフォルトの状態に戻すことができます。 コマンド。
$ unset IFS
例4-whileループを使用してファイルを読み取る
while
ファイルを1行ずつ読み取り、処理する場合は、loopをお勧めします。
test.txt
という名前の新しいファイルを作成します 以下のコンテンツを使用します。 2行目の後に空の行があり、空の行がどのように処理されるかの動作を示しています。
14:00 Brighton v Leicester 14:00 West Ham v Man Utd 16:30 Spurs v Chelsea
read
を使用します リダイレクトからの入力を受け取り、それを入力リダイレクト演算子とともに変数に格納するコマンド。ファイル名はwhile
にリダイレクトされます。 ループ。 read
コマンドはデフォルトのIFSを使用して単語分割境界を設定します。
$ while read line do echo $line done < test.txt

上記の例では、test.txt
ファイルはwhile
にリダイレクトされます ループしてread
コマンドは行ごとに読み取り、変数 "line"に格納します そしてそれはループ内でさらに処理されます。この方法に従うと、空の行はスキップされません。これは、希望する動作ではありません。したがって、スキップするには空の行を明示的に作成する必要があります。
入力ファイルから空の行を削除するための複数のオプションがあります。 sed
を使用できます 、awk
、および条件ステートメントなど。両方のawk
を使用することをお勧めします およびsed
while
を使用してループする前に、空の行をクリーンアップします ループ。
# USING SED $ sed -i '/^[[:space:]]*$/d' test.txt 14:00 Brighton v Leicester 14:00 West Ham v Man Utd 16:30 Spurs v Chelsea
# USING AWK $ awk 'NF' test.txt

前の例で見たように、ファイルの読み取り方法に応じてIFSを変更できます。たとえば、CSVファイルを処理している場合は、区切り文字をコンマに設定できます。同じ入力ファイルをCSV形式に変更しました。
14:00,Brighton,Leicester 14:00,West Ham,Man Utd 16:30,Spurs,Chelsea
以下の例では、IFSはコンマ(IFS=","
)に設定されています )および各フィールドは個別の変数(time、team1、team2)に格納されます。
while IFS="," read time team1 team2 do echo "$team1 is playing against $team2 at $time" done < test.txt

例5-ブレークアンドコンティニューを使用したループフロー制御
bash for loopの記事を読んだことがあれば、 breakとは何かを知っているかもしれません。 および続行 のために使用される。 breakとcontinueはどちらも、ループのフローを制御するのに役立つbash組み込みキーワードです。
「break」キーワードはループを完全に終了し、スクリプト内の次のコマンドに制御を渡します。以下の例では。 NUM
の場合 が3に等しい場合、ループはbreak
によって終了します。 コマンド。
$ NUM=5 while [[ $NUM -ne 0 ]] do printf "Value of NUM = $NUM \n" if [[ $NUM -eq 3 ]] then break fi ((--NUM)) done

「continue」キーワードは、現在の反復をスキップし、制御をwhileループに戻し、次の反復を開始します。
$ NUM=0 while [[ $NUM -lt 5 ]] do ((++NUM)) if [[ $NUM -eq 3 ]] then continue fi printf "Value of NUM = $NUM \n" done

2。ループまで
until
ループはwhile
の正反対です ループ。 while
loopは、条件がtrueであると評価して、コードのブロックとuntil
を実行します。 loopは、実行されるループの条件がfalseであると評価します。
構文はwhile
と同じです ループしますが、キーワードwhile
の代わりに 、until
使用されます。
until [[ condition ]] do Command 1 Command 2 .... Command 3 done
以下の例から、until
を見ることができます ループは変数NUM
を評価します 5以上になります。 NUM
なので、falseです。 はゼロに設定され、((++NUM))
を使用して後続の反復でインクリメントされます 。したがって、NUM
5に等しい場合、条件はtrueであると評価され、until
ループは実行を停止します。
$ NUM=0
$ until [[ $NUM -ge 5 ]] do echo $NUM ((++NUM)) done

無限ループを作成するには、キーワード "false"を使用できます。 。
$ NUM=0
$ until false do echo $NUM ((++NUM)) done
ループフローを制御するには、break
を使用できます およびcontinue
while
に示されているようなキーワード 上記のループセクション。
結論
この記事では、while
の使用方法を見てきました ループしてuntil
bashスクリプトでループします。 until
for
と比較して、ループの使用頻度は最も低くなります。 およびwhile
ループしますが、それはスクリプトと必要なループのタイプを決定することです。 3つのループすべてを快適に使用できます。
ご質問やご意見がございましたら、下のコメントセクションからお気軽にお知らせください。
関連記事:
- Bashスクリプティング–例で説明されている関数
- Bashスクリプティング–例で説明されている変数
- Linuxの例で説明されているBashEchoコマンド
- 初心者向けのBashヒアドキュメントチュートリアル
- Linuxで成功するまでコマンドを繰り返す方法
- エクスポートがある場合とない場合のBash変数の定義の違い