ループの維持 – Bash For、While、Until ループの例
ループ ステートメントは、プログラムにステートメントを繰り返し実行させるために使用されます。実行されたステートメントは、ループ本体と呼ばれます。
ループは、制御式の値が 0 になるまで実行されます。制御式は、任意のスカラー データ型にすることができます。
シェル言語には、複数の反復またはループ ステートメントも用意されています。この記事では、いくつかの例を使用して、bash が提供するループ ステートメントを確認します。
Bash は次の 3 種類のループ ステートメントをサポートします
<オール>この記事は、進行中の 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 ループは、特定のイベントが発生するのを待つ方法として、コマンド ラインで非常に役立ちます。
-
whileループを使用してBashスクリプトでファイルを読み取るさまざまな方法
この記事では、whileループを使用してbashスクリプトでファイルを読み取る方法について説明します。 。ファイルの読み取りは、プログラミングの一般的な操作です。さまざまな方法と、どの方法を使用するのがより効率的かを理解している必要があります。 bashでは、1つのタスクをさまざまな方法で実行できますが、タスクを実行するための最適な方法は常に存在するため、それに従う必要があります。 whileループを使用してファイルの内容を読み取る方法を確認する前に 、whileループがどのように機能するかについての簡単な入門書。 whileループは条件を評価し、条件が真の場合に指定されたコードのセットを繰
-
Bashを楽しい方法で学ぶための3つのコマンドラインゲーム
学習は大変な仕事であり、誰も仕事が好きではありません。つまり、Bashを習得するのがどれほど簡単であっても、それでもあなたにとっては仕事のように感じるかもしれません。もちろん、ゲームを通して学ばない限り。 Bashターミナルの使い方を教えるゲームがたくさんあるとは思わないでしょうし、あなたは正しいでしょう。真面目なPCゲーマーは、Falloutシリーズがボールトに端末ベースのコンピューターを備えていることを知っています。これは、テキストを介してコンピューターとやり取りするという考えを正常化するのに役立ちますが、AlpineやEmacsのようなアプリケーションを備えているにもかかわらず、Fal