GNU/Linux >> Linux の 問題 >  >> Linux

Bashスクリプティング–ループが例で説明されている間とまで

これは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変数の定義の違い

Linux
  1. BashForループガイドと例

  2. Linuxのヘッドコマンドとテールコマンドを例で説明

  3. Bash の For ループと While ループの例

  1. Bash while Loop

  2. ループの維持 – Bash For、While、Until ループの例

  3. Bash while ループで and を使用する

  1. ループするまでBash

  2. 実用的な例を使用したBashForLoop

  3. Linuxの例で説明されたBashエコーコマンド