BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

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

ループの維持 – Bash For、While、Until ループの例 ループ ステートメントは、プログラムにステートメントを繰り返し実行させるために使用されます。実行されたステートメントは、ループ本体と呼ばれます。

ループは、制御式の値が 0 になるまで実行されます。制御式は、任意のスカラー データ型にすることができます。

シェル言語には、複数の反復またはループ ステートメントも用意されています。この記事では、いくつかの例を使用して、bash が提供するループ ステートメントを確認します。

Bash は次の 3 種類のループ ステートメントをサポートします

<オール>
  • for ループ
  • ループ中
  • ループまで
  • この記事は、進行中の Bash チュートリアル シリーズの一部です。

    ループはネストできます。他のプログラミング言語と同様に、bash は現在のループを終了する break ステートメントと、ループ ステートメントの次の反復を再開する continue ステートメントもサポートしています。

    Bash For ループ – 最初の方法

    for ループは通常、bash ループに入る前に反復回数がわかっている場合に使用されます。 Bash は 2 種類の for ループをサポートしています。 bash for ループの最初の形式は次のとおりです。

    for varname in list
    	do
    		commands ##Body of the loop
    	done

    上記の構文では:

    <センター>
    • for、in、do、done がキーワードです
    • List はアイテムのリストを持つ任意のリストです
    • varname は任意の Bash 変数名です。

    この形式では、for ステートメントは、リスト内の項目ごとに 1 回、本体で囲まれたコマンドを実行します。リストの現在の項目は、ループのたびに変数「varname」に格納されます。この varname は、ループの本体で処理できます。このリストは、スペースで区切られた複数の単語を含む変数にすることができます。 for ステートメントに list がない場合は、シェルに渡された位置パラメーターを取ります。

    Bash For ループの例 1. すべての Zip ファイルを解凍します

    次の例では、ルート ディレクトリで「*.zip*」に一致するファイルのリストを検索し、zip ファイルが存在するのと同じ場所に新しいディレクトリを作成し、zip ファイルのコンテンツを解凍します。

    # cat zip_unzip.sh
    #! /bin/bash
    # Find files which has .zip
    for file in `find /root -name "*.zip*" -type f`
    do
    
    # Skip the extension .zip
    dirname=`echo ${file} | awk -F'.' '{print $1}'`
    
    # Create the directory
    mkdir $dirname
    
    # Copy the zip file
    cp ${file} ${dirname}
    cd $dirname
    
    # Unzip the zip file from newly created directory
    unzip ${dirname}/$(echo ${file##/*/})
    done
    • この例では、find コマンドはファイルのリストを返します。このリストから各ファイルがループ処理されます。
    • アイテムごとに、zip ファイルの名前でディレクトリが作成され、新しく作成されたディレクトリに zip ファイルがコピーされ、そこから zip ファイルが解凍されます。
    • echo ステートメント echo ${file##/*/} は、パスではなくファイル名のみを提供します。
    # ./zip_unzip.sh
    Archive:  /root/test2/test2.zip
     extracting: t1/p
     extracting: t1/q
     extracting: t1/r
     extracting: t1/s
     extracting: t1/t
     extracting: t1/u
     extracting: t1/v
    Archive:  /root/test1/test1.zip
     extracting: t/a
     extracting: t/b
     extracting: t/c
     extracting: t/d
     extracting: t/e

    Awk の While と For ループの記事で説明したように、Bash ループと同様に、Awk も for ループと while ループを提供します。

    Bash For ループ – 2 番目の方法

    for ループの 2 番目の形式は、「C」プログラミング言語の for ループに似ており、3 つの式 (初期化、条件、および更新) があります。

    for (( expr1; expr2; expr3 ))
             do
    		commands
             done
    • 上記のコマンド構文の bash では、最初の繰り返しの前に expr1 が評価されます。これは通常、ループの変数を初期化するために使用されます。
    • do と done の間のすべてのステートメントは、expr2 の値が TRUE になるまで繰り返し実行されます。
    • ループの各反復の後、expr3 が評価されます。これは通常、ループ カウンターをインクリメントするために使用されます。

    次の例では、n 個の乱数を生成します。

    Bash の例 2. n 個の乱数を生成

    $ cat random.sh
    #! /bin/bash
    
    echo -e "How many random numbers you want to generate"
    read max
    
    for (( start = 1; start <= $max; start++ ))
    do
            echo -e $RANDOM
    done
    
    $ ./random.sh
    How many random numbers you want to generate
    5
    6119
    27200
    1998
    12097
    9181

    上記のコード スニペットでは、for ループが最大回数で乱数を生成します。 RANDOM は、呼び出しごとにランダムな整数を返す内部 bash 関数です。

    ループ中にバッシュ

    シェル プログラミング言語が提供するもう 1 つの反復ステートメントは while ステートメントです。

    Syntax:
    while expression
    do
    	commands
    done
    

    上記の while ループ構文では:

    • while、do、done がキーワード
    • Expression は、スカラー値を返す任意の式です
    • While ステートメントにより、指定された条件式が true の間、コード ブロックが実行されます。

    Bash While の例 3. 内容をファイルに書き込む

    次の例では、stdout からデータを読み取り、ファイルに書き込みます。

    $ cat writefile.sh
    #! /bin/bash
    
    echo -e "Enter absolute path of the file name you want to create"
    read file
    while read line
    do
    echo $line >> $file
    done
    
    $ sh writefile.sh
    Enter absolute path of the file name you want to create
    /tmp/a
    while
    for
    until
    
    $ cat /tmp/a
    while
    for
    until

    上記の例では、ユーザーからファイル名を読み取り、stdin からデータの行を読み取り、各行を特定のファイル名に追加します。 EOF に入ると読み取りに失敗するため、ループはそこで終了します。

    多くの bash スクリプトを作成している場合は、前述のように Vim bash-support プラグインを使用して、Vim エディターを Bash IDE として使用できます。

    Bash While の例 4. ファイルの内容を読み取る

    前の例では、stdout からデータを読み取り、それをファイルに書き込みます。この例では、ファイルの
    コンテンツを読み取り、stdout に書き込みます。

    $ cat read.sh
    #! /bin/bash
    echo -e "Enter absolute path of the file name you want to read"
    read file
    exec <$file # redirects stdin to a file
    while read line
    do
    echo $line
    done
    
    $ ./read.sh
    
    Enter absolute path of the file name you want to read
    /tmp/a
    while
    for
    until

    この例では、読み取るファイル名を取得し、exec を使用して stdin をファイルにリダイレクトします。その時点から、すべての stdin は、キーボードからではなく、そのファイルから取得されます。 read コマンドは標準入力から行を読み取るため、while ループは EOF が発生するまで標準入力を読み取ります。

    ループまでバッシュ

    until ステートメントは、構文と機能が while ステートメントと非常によく似ています。この 2 つの違いは、until ステートメントは条件式が false のときにコード ブロックを実行し、while ステートメントは条件式が true のときにコード ブロックを実行することだけです。

    syntax:
    
    until expression
    	do
    	   commands #body of the loop
    	done
    

    上記の bash until 構文では:
    until、do、done はキーワードです
    expression 任意の条件式

    例 5 まで Bash を実行します。ログファイルを監視します

    この例では、ログ ファイルのサイズを監視し、ログ ファイルのサイズが 2000 バイトに達すると、そのログ ファイルのコピーを取得します。

    $ cat monitor.sh
    
    file=/tmp/logfile
    until [ $(ls -l $file | awk '{print $5}') -gt 2000 ]
            do
                echo "Sleeping for next 5 seconds"
                sleep 5
            done
    date=`date +%s`
    cp $file "$file-"$date.bak
    
    $ ./monitor.sh
    Sleeping for next 5 seconds
    Sleeping for next 5 seconds
    
    $ ls -l /tmp/logfile*
    -rw-r--r-- 1 sss sss      2010 Jun 24 12:29 logfile
    -rw-r--r-- 1 sss sss      2005 Jun 24 16:09 logfile-1277474574.bak

    until ステートメントは、条件が真になるまでループの本体を実行し続けます。この例の条件では、ファイルのサイズが 2000 バイトを超えているため、2000 バイトに達するとファイルをコピーします。

    また、以前の Bash Array の例も参照してください。

    例 6 までのバッシュ。マシンが起動するのを待つ

    この例は、そのマシンに ssh を実行する前に、マシンが起動するまで待機するために使用されます。 until ループ ステートメントは、ping が応答を返したときにのみ終了します。

    $ cat mac_wait.sh
    #! /bin/bash
    
    read -p "Enter IP Address:" ipadd
    echo $ipadd
    until ping -c 1 $ipadd
    do
            sleep 60;
    done
    ssh $ipadd
    
    $./mac_wait.sh
    Enter IP Address:192.143.2.10
    PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data.
    
    --- 192.143.2.10 ping statistics ---
    1 packets transmitted, 0 received, 100% packet loss, time 0ms
    
    PING 192.143.2.10 (192.143.2.10) 56(84) bytes of data.
    64 bytes from 192.143.2.10: icmp_seq=1 ttl=64 time=0.059 ms
    
    --- 192.143.2.10 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.059/0.059/0.059/0.000 ms
    The authenticity of host '192.143.2.10 (192.143.2.10)' can't be established.
    Are you sure you want to continue connecting (yes/no)? yes

    until ループは、特定のイベントが発生するのを待つ方法として、コマンド ラインで非常に役立ちます。


    1. whileループを使用してBashスクリプトでファイルを読み取るさまざまな方法

      この記事では、whileループを使用してbashスクリプトでファイルを読み取る方法について説明します。 。ファイルの読み取りは、プログラミングの一般的な操作です。さまざまな方法と、どの方法を使用するのがより効率的かを理解している必要があります。 bashでは、1つのタスクをさまざまな方法で実行できますが、タスクを実行するための最適な方法は常に存在するため、それに従う必要があります。 whileループを使用してファイルの内容を読み取る方法を確認する前に 、whileループがどのように機能するかについての簡単な入門書。 whileループは条件を評価し、条件が真の場合に指定されたコードのセットを繰

    2. Bashを楽しい方法で学ぶための3つのコマンドラインゲーム

      学習は大変な仕事であり、誰も仕事が好きではありません。つまり、Bashを習得するのがどれほど簡単であっても、それでもあなたにとっては仕事のように感じるかもしれません。もちろん、ゲームを通して学ばない限り。 Bashターミナルの使い方を教えるゲームがたくさんあるとは思わないでしょうし、あなたは正しいでしょう。真面目なPCゲーマーは、Falloutシリーズがボールトに端末ベースのコンピューターを備えていることを知っています。これは、テキストを介してコンピューターとやり取りするという考えを正常化するのに役立ちますが、AlpineやEmacsのようなアプリケーションを備えているにもかかわらず、Fal