このBashスクリプトチュートリアルの最初の部分では、Bashスクリプトの記述方法について説明しました。 Bashスクリプトが役立つさまざまな使用法と独自のシナリオを検討し、それらがどれほど素晴らしいものであるかを示す良い例を示しました。
チュートリアルのこの部分では、 for
を見ていきます。 コマンド、および while
指図。これらのコマンドを使用して、一連の値を反復処理するループを作成する方法を示します。
Forループ
Linuxでは、ループは、指定された間隔でコマンドを繰り返し実行するために使用するものです。ループは、同じ目的でさまざまなプログラミング言語で使用されます。
Linuxには複数の異なるタイプのループがありますが、記事のこのセクションでは、 for
に焦点を当てます。 ループ。
#!/bin/bash for y in a b c d w x y z > do > echo $y done
上のスクリーンショットでわかるように、「y」変数(コマンドのために使用される意味のないプレースホルダー)は、アルファベットの数文字に起因すると考えられます。
次に、その変数を echo
に渡しました。 コマンドを実行すると、以下の文字を出力できました。
単純な値の反復
for
を使用できます Bashスクリプトのコマンド。これを行うには、最初にLinuxターミナルでテキストファイルを作成する必要があります。 touch
を利用できます テキストファイルを簡単に作成するためのコマンド。
$ touch script
上記の構文では、「スクリプト」と呼ばれるテキストファイルが作成されます。必ず.sh
を使用してテキストファイルを作成してください ファイル拡張子。 script
を作成するとき 、 for
を含む実際のスクリプトで編集する必要があります コマンド。
これは、 nano
などのいくつかの異なるテキストファイル編集コマンドを実行することで実現できます。 コマンド、および vi
コマンドなど
ただし、 nano
を使用することをお勧めします 、Linuxで最もシンプルで使いやすいコマンドテキストエディタの1つです。
$ nano script
上記の構文により、 script
が開きます。 nanoテキストエディタで。ここでは、スクリプトを入力します。
このテキストファイルには#!/ bin / bash
が含まれている必要があることに注意してください 、これは使用するシェルについてBashスクリプトに通知するため、Bashスクリプトを正常に作成するための極めて重要なコンポーネントです。
#!/bin/bash for var in first second third fourth fifth; do echo The $var item done
複素数値の反復
前の例では、 for
の使用方法を示しました ユーザーが作成したBashスクリプトで単純な値を反復処理するコマンド。ここでの単純な単語は、1つの単語のみを含む値を指します。
ただし、前の例で「first」を使用して見たものの代わりに、「first」の行に沿ったものを含むリストが表示される場合があります。これには、1つの値に対して複数の単語が含まれています。これらの値は、「複雑な」値と呼ばれるものです。
リストにこれらの複雑な値が含まれている場合は、引用符で囲んで参照する必要があります。これにより、スクリプトはそれが1つの値であると認識します。
#!/bin/bash for var in first "the second" "the third" "I’ll do it"; do echo "This is: $var" done
コマンド置換
for
でコマンド置換を使用することもできます Bashスクリプトのコマンド。
#!/bin/bash my_file="file01" for var in $(cat $my_file); do echo " $var" done
ここでは、 $()
内でcatコマンドを使用することでわかるように、Bashサブシェルでコマンド置換を使用しました。;これにより、 cat
からの出力を使用できるようになります コマンドを実行し、各行に1つの単語があると想定してファイルの内容を取得します。
ただし、これらの行の1つにスペースがある場合、すべての単語がフィールドと見なされます。この場合、新しい行をスペースではなく区切り文字として扱うようにシェルに指示する必要があります。
フィールドセパレーター
デフォルトでは、次の文字はBashシェルによってフィールドと見なされます。
- スペース
- タブ
- 改行
テキストにこれらの文字のいずれかが含まれている場合、シェルはそれが新しいフィールドであると見なします。これらの文字を使用する必要がある場合は、内部フィールドセパレータまたはIFS環境変数を変更する必要があります。
$ IFS=$’n’
上記の構文により、Bashシェルは新しい行をスペース文字ではなく区切り文字と見なします。
#!/bin/bash file="/etc/passwd" IFS=$'n' for var in $(cat $file); do echo " $var" done
IFS
を使用して、フィールド区切り文字をコロンに割り当てることもできます。 以下に示すように。
$ IFS=:
かなり素晴らしいですね
ディレクトリファイルの反復
for
を使用することもできます Bashスクリプトをループして、ホームディレクトリ内のファイルを一覧表示します。
#!/bin/bash for obj in /home/ubuntu/*; do if [ -d "$obj" ]; then echo "$obj is a folder" elif [ -f "$obj" ]; then echo "$obj is a file" fi doneをエコーします。
このプロセスでは、 if
を利用する必要があります ファイルとフォルダをチェックするステートメント。ただし、前の投稿を読んだことがあれば、それはあなたにとって大きな問題にはならないはずです。ただし、万が一、復習が必要な場合は、確認することをお勧めします。
for
を含むBashスクリプトでは、アスタリスク(*)と呼ばれるワイルドカードを使用しました。 ホームディレクトリ内のファイルとフォルダを一覧表示できるループ。 Bashスクリプトでは、このプロセスは「ファイルグロブ」と呼ばれます。 。」ファイルグロブとは、名前の付いた既存のすべてのファイルを意味します。
if
の変数に注意してください ファイル名またはフォルダー名にスペースが含まれている可能性があるため、ステートメントは引用符で囲んで記述されます。この手順を省略した場合、すべてのファイルとディレクトリを一覧表示できなかった可能性があります。
ファイル行を反復処理する
for
を使用できます Bashスクリプトをループして、ファイルの内容を繰り返し処理します:
#!/bin/bash IFS=$'n' for text in $(cat /etc/passwd); do echo "This line $text ++ contains" IFS=: for field in $text; do echo " $field" done done
ここでは、2つのループがあります。最初のループはファイルの行を反復処理し、セパレーターは新しい行であり、2番目の反復は行自体の単語を反復処理し、セパレーターはコロンです:
ファイルデータ
このアイデアは、CSVファイルまたはコンマ区切り値ファイルがある場合に適用できます。考え方は同じです。必要に応じてセパレータを変更するだけです。
ForループCスタイル
C言語に精通している場合は、 for
について少しずれていることに気付くかもしれません。 Linuxでは時々ループします。
これは、 for
を作成する方法が2つあるためです。 ループ;このチュートリアルの冒頭ですでに説明した標準のLinuxの方法と、「Cスタイル」の方法。
for (var= 0; var < 5; var++) { printf(“number is %dn”, var); }
上記の構文は、 for
用です。 Cで書かれたループ。Cスタイルのfor
Linuxのループは、これと非常によく似ていますが、いくつかの小さな変更があります。これは、以下で確認できます。
for((変数=開始;条件;反復ステップ))
for (( var = 1; var < 5; var++ ))
絵をよりよく描くために、Cスタイルの for
を使用したBashスクリプトの例を含めます。 Linuxターミナルでループします。
#!/bin/bash for ((var = 1; var <= 10; var++)); do echo "number is $var" done
これをテキストファイルに入れて起動します。
続行コマンド
バッシュの続行コード> commandは、現在の反復の外側のループ内のコマンドを無視し、次の反復に制御を与えます。このコマンドを使用すると、ループを終了せずに、ループ内の残りのコマンドの実行を停止できます。
次のいくつかの例では、このコマンドをLinuxのBashスクリプトループで使用する方法について説明します。
ブレークコマンド
breakコマンドを使用して、whileループやuntilループなどの任意のループを終了できます。
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
ループは14に達するまで実行され、コマンドはループを終了します。
このコマンドの例については、少し後で説明します。
Whileループ
forループは、Bashスクリプトでループする唯一の方法ではありません。 while
loopは同じ仕事をしますが、すべての反復の前に条件をチェックします。 while
の構造 ループは以下で見ることができます。
while [ condition ] do commands done
Bashスクリプトの例を示します。
#!/bin/bash number=10 while [ $number -gt 4 ]; do echo $number number=$(($number - 1)) done
このBashスクリプトが機能する方法は単純です。 while
で始まります 数値がゼロより大きいかどうかを確認するコマンドを実行すると、ループが実行され、数値は毎回1ずつ減少します。ループが繰り返されるたびに、スクリプトは数値の値を出力します。ループは、その数が0に達するまで実行されます。
ネストされたループ
while
のように、他のループ内にループを作成できます たとえば、ループします。ループ内のこれらのループは、ネストされたループと呼ばれます。まず、ネストされた for
を作成する方法を調べて、これらについて詳しく説明します。 次の例ではループします。
複数のforループ(ネストされている)
このチュートリアルのこれまでの例では、 for
を作成する方法を示しました。 LinuxのBashスクリプトでループします。しかし、ネストされた for
と呼ばれるものもあります ループします。簡単に言うと、これらは他のループ内のループ、または単に複数のループです。
これがどのように見えるかの簡単な例を、簡単な調査と説明とともに以下に示します。
for y in a b c d e f do for u in a b c d e f do echo "$y$u" done done
上のスクリーンショットでわかるように、Linuxコマンドラインターミナルでスクリプトを実行したときに受け取る出力は、次のようになります。各 for
のテキスト例 ループは「abc def」です。
スクリプトが行うことは、内側のループからのテキストと一緒に外側のループのテキストをエコーすることです。
スクリプトは、内側のループに含まれるすべてのフィールドが出力されるまで、外側のループのテキストの最初のフィールド(この場合はスペース、これについては後で説明します)を出力し続けます。
内側のループの出力が完了すると、Bashスクリプトは外側のループのテキストの次のフィールドの出力を開始します。
このプロセス全体は、各ループのすべてのフィールドがLinux端末の出力に完全に出力されるまで繰り返されます。
複数のwhileループ(ネストされたwhile)
ネストされたfor
のように コマンドループ、ネストされた while
も存在します コマンドループ。これらは、 for
のネストされたループとまったく同じように機能します 指図;別のループ内のループ。
以下の構文は、通常の while
と非常によく似ています。 ネストされたwhile
の構造としてのループ ループは、ベースの while
の単なる拡張形式です。 ループ。これは、以下の構文で確認できます。
while [condition] do statements1 statements2 while [condition] do continue done statements3 done
上記の構文は、選択した条件が満たされるまで、指定されたタスクを実行します。これはいわゆるループです。ただし、上記の例のループはネストされているため、これは、上記のタスクの1つが別のループ自体であることを意味します。
次へ
while
ループとfor
ループは、LinuxでBashスクリプトを使用して複雑なプロセスを実行する場合に非常に役立ちます。
ただし、さまざまな理由で、Bashスクリプトのループの1つを強制終了する必要がある場合があります。このシナリオは、見た目は残酷ですが、システム管理作業でよく発生します。したがって、この概念をよく理解しておくことをお勧めします。
Bashシェルでは、 break
コマンドとcontinue
コマンドは、Bashスクリプトループのフローを制御するために必要なツールを提供できます。
以下のいくつかの例を使用して、これらのコマンドが個別にどのように機能するかを示します。
brea
を利用するための構文 while
を終了するコマンド ループは次のとおりです:
$ while [ condition ] do commands continue done
続行
コマンドbreak
コマンドは非常によく似ており、互いに反対であると見なすことができます。 続行
コマンドはbreak
とまったく同じように機能します コマンド、それだけがそれを殺す代わりにループを続けます。
終了Whileループ
break
コマンドは現在のループを強制終了し、そのループに続く次のコマンドに制御を与えます。このプロセスを利用して、 for
などのループを終了できます。 、 while
、など。 break
の構文 コマンドは次のとおりです:
$ while [ condition ] do commands break done
ただし、前述のように、両方の continue
コマンドとbreak
コマンドは、 while
以外の他のBashスクリプトループに使用できます。 ループ。 for
でそれらの使用方法を示します ループ。
Exit For Loop
これらのループ制御コマンドは、 for
で使用できます。 ループ。 break
を使用します for
を終了するコマンド Bashスクリプトでループします。
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
for
ループは、bashスクリプトで指定した数(14)に達するまで実行されます。指定した数に達すると、 break
コマンドはfor
を終了します ループ。
BreakIfステートメント
break
の使用方法を示しました for
を終了するコマンド ループしますが、このコマンドを使用して if
を終了することもできます これらのBashスクリプトループ内のステートメント。
i=0 while [[ $i -lt 10 ]] do echo "Number: $i" ((i++)) if [[ $i -eq 5 ]]; then break fi done
継続ステートメント
前の例で行ったのと同じことをcontinue
で行います break
で行ったようにコマンド while
のコマンド Bashスクリプトでループします。
i=0 while [[ $i -lt 10 ]]; do ((i++)) if [[ "$i" == '5' ]]; then continue fi echo "Number: $i" doneを続行します
まとめ
あなたが新しいことを1つか2つ学んだことを願っています。または、少なくとも、あなたがすでに知っていることを確認できたと思います。今日の私の最後の言葉は、読み続けて練習することです。
ありがとうございます。