ループ

Bash には、「for」、「while」、「until」という 3 つのループ構文が用意されています。

while ループ

while ループには判定条件があり、その条件が満たされる限り、指定されたステートメントがループ内で実行され続けます。

条件を実行します。
  コマンド
終わり

上記のコードでは、条件 condition が満たされる限り、コマンド commands が実行されます。そして、条件「condition」が満たされているかどうかを再度判断し、満たされている限り実行を続けます。条件が満たされない場合にのみ、ループは終了します。

ループ条件 condition は if 構造体の判定条件と同様に記述した test コマンドを使用することができます。

#!/bin/bash

数値=0
while [ "$number" -lt 10 ];
  echo "数値 = $number"
  数値=$((数値 + 1))
終わり

上記の例では、変数 $number が 10 未満である限り、$number が 10 に等しくなるまで 1 を加算し続け、その後ループを終了します。

キーワード dowhile と同じ行になくてもよく、セミコロンを使用してそれらを区切る必要はありません。

真実ながら
する
  echo 'こんにちは、ループ中...';
終わり

上記の例は無限ループしますが、Ctrl + c を押すと停止できます。

while ループを 1 行で記述することもできます。

$ while true; do echo 'こんにちは、ループ中です...';

「while」の条件部分は、コマンドを実行することもできます。

$ while echo 'ECHO'; do echo 'こんにちは、ループ中です...';

上の例では、判定条件は「エコー 'ECHO'」です。このコマンドは常に正常に実行されるため、上記のコマンドは無限ループを生成します。

「while」の条件部分は任意の数のコマンドを実行できますが、実行結果の信頼性は最後のコマンドの実行結果のみに依存します。

$ while true; do echo 'こんにちは、ループしています...';

上記のコードを実行すると、while の最後のコマンドが false であるため、出力はありません。

ループまで

until ループは while ループの逆で、判定条件が満たされない限り(判定条件が失敗した場合)、指定されたステートメントがループ内で実行され続けます。判定条件を満たしたらループを抜けます。

条件まで
  コマンド
終わり

キーワード dountil と同じ行に記述する必要はありません。その場合、キーワードをセミコロンで区切る必要はありません。

状態まで
する
  コマンド
終わり

以下に例を示します。

$ false; do echo 'こんにちは、ループが完了するまで';
こんにちは、ループするまで...
こんにちは、ループするまで...
こんにちは、ループするまで...
^C

上記のコードでは、「until」部分は常に「false」であるため、コマンドが無期限に実行されるため、Ctrl + C を押して終了する必要があります。

#!/bin/bash

数値=0
[ "$number" -ge 10 ] まで;
  echo "数値 = $number"
  数値=$((数値 + 1))
終わり

上記の例では、変数 number が 10 未満である限り、number が 10 以上になるまで 1 を加算し続け、その後ループを終了します。

「until」の条件部分はコマンドにすることもでき、コマンドが正常に実行されるまで繰り返し試行されることを示します。

cp $1 $2 まで。
  echo '待機中にコピーに失敗しました...'
  睡眠5
終わり

上の例は、コマンド cp $1 $2 の実行が失敗する限り、成功するまで 5 秒後に再試行することを示しています。

条件が負に設定されている限り、「until」ループは「while」ループに変換できます。上記の例は次のように書き換えることができます。

一方で ! cp $1 $2;
  echo '待機中にコピーに失敗しました...'
  睡眠5
終わり

一般に、「until」はあまり使用されず、「while」は一律に使用できます。

for...in ループ

for...in ループは、リストの各項目を反復処理するために使用されます。

リスト内の変数の場合
する
  コマンド
終わり

上記の構文では、for ループは list リストから 1 つの項目を変数 variable として取り出し、ループ本体で処理します。

キーワード do は、for と同じ行にセミコロンで区切って書くことができます。

リスト内の変数の場合は、
  コマンド
終わり

以下に例を示します。

#!/bin/bash

for i は word1 word2 word3 で実行します。
  エコー $i
終わり

上記の例では、word1 word2 word3 は 3 つの単語を含むリストであり、変数 i は順に word1word2word3 に等しく、コマンド echo $i が実行されます。それに応じて3回。

リストはワイルドカード文字を使用して生成できます。

私は*.pngで行います。
  ls -l $i
終わり

上記の例では、*.png は現在のディレクトリ内のすべての PNG 画像ファイルに置き換えられ、変数 i は順番に各ファイルと等しくなります。

リストはサブコマンドを使用して生成することもできます。

#!/bin/bash

カウント=0
$(cat ~/.bash_profile) の場合;
  カウント=$((カウント + 1))
  echo "単語 $count ($i) には $(echo -n $i | wc -c) 文字が含まれています"
終わり

上の例では、cat ~/.bash_profile コマンドは ~/.bash_profile ファイルの内容を出力し、各単語を走査することで、ファイルに含まれる単語の数と各単語の文字数を計算します。

in list の部分は省略できます。その場合、list はスクリプト $@ のすべてのパラメータのデフォルトになります。ただし、読みやすくするために、省略しないことをお勧めします。以下の例を参照してください。

ファイル名については、
  「$ファイル名」をエコーする
終わり

# に相当

"$@" のファイル名については、次のようにします。
  「$ファイル名」をエコーする
終わり

関数本体でも同じことが当てはまります。for...in ループが in list 部分を省略すると、list が関数のすべてのパラメータにデフォルト設定されます。

for ループ

「for」ループは、C 言語のループ構文もサポートしています。

for (( 式 1; 式 2; 式 3 ));
  コマンド
終わり

上記のコードでは、expression1 はループ条件の初期化に使用され、expression2 はループの終了条件の決定に使用され、expression3 は各ループ反復の最後に実行されて値が更新されます。

ループ条件は二重括弧で囲まれていることに注意してください。また、括弧内の変数を使用する場合は、ドル記号「$」を追加する必要はありません。

これは、以下の while ループと同等です。

(( 式 1 ))
while (( 式 2 ));
  コマンド
  (( 式 3 ))
終わり

以下に例を示します。

for (( i=0; i<5; i=i+1 ));
  エコー $i
終わり

上記のコードでは、初期化された変数 i の値は 0 であり、ループの実行条件は i が 5 未満であることです。各ループ反復の終了時に、「i」の値が 1 ずつ増加します。

for の条件部分の 3 つのステートメントは省略できます。

のために ((;;))
する
  変数の読み取り
  if [ "$var" = "."
    壊す
  フィ
終わり

上記のスクリプトは、ユーザーがドット (.) を入力するまでコマンド ライン入力を繰り返し読み取り、ループから抜け出します。

休憩、続行

Bash には、ループ内のループから抜け出すために使用される 2 つの内部コマンド break continue が用意されています。

「break」コマンドはループを直ちに終了し、プログラムはループ ブロックの後のステートメントの実行を続行します。つまり、残りのループは実行されません。

#!/bin/bash

1 2 3 4 5 6 の数字の場合
する
  エコー「数値は$numberです」
  if [ "$number" = "3" ];
    壊す
  フィ
終わり

上の例では、結果が 3 行だけ出力されます。変数 $number が 3 に等しくなると、ループが抜け出して実行は続行されません。

「Continue」コマンドは現在のサイクルを直ちに終了し、次のサイクルの実行を開始します。

#!/bin/bash

while read -p "どのファイルをテストしますか?"
する
  if [! -e "$ファイル名" ];
    echo "ファイルは存在しません。"
    続く
  フィ

  echo "有効なファイルを入力しました。"
終わり

上の例では、ユーザーが入力したファイルが存在しない限り、「Continue」コマンドが有効になり、後続の print ステートメントを実行せずに直接次のサイクルに入ります (ユーザーはファイル名を再入力できます)。

構造を選択

「select」構造は主に単純なメニューを生成するために使用されます。その構文は基本的に for...in ループと同じです。

名前を選択してください
[リスト内]
する
  コマンド
終わり

Bashはselectに対して以下の処理を順番に実行します。

  1. select は、リスト list 内の各項目をコンテンツとするメニューを生成します。各項目の前には番号が付いています。
  2. Bash はユーザーに項目を選択し、その番号を入力するように求めます。
  3. ユーザーが入力すると、Bash は項目の内容を変数 name に保存し、項目の番号を環境変数 REPLY に保存します。ユーザーが入力せずに Enter キーを押すと、Bash はユーザーが選択できるメニューを再出力します。
  4. コマンド本体の「commands」を実行します。
  5. 実行が完了したら、最初のステップに戻り、プロセスを繰り返します。

以下に例を示します。

#!/bin/bash
# 選択.sh

サムスン・ソニー・iphone・シンフォニー・ウォルトンのセレクトブランド
する
  エコー「$brandを選択しました」
終わり

上記のスクリプトを実行すると、Bash はユーザーが選択できるブランドのリストを出力します。

$ ./select.sh
1) サムスン
2) ソニー
3) iPhone
4) 交響曲
5) ウォルトン
#?

ユーザーが数値を入力しない場合は、Enter キーを押すだけです。 Bash は、ユーザーが Ctrl + c を押して実行を終了するまで、このメニューを再出力します。

selectcase と組み合わせて、さまざまな項目に対してさまざまなコマンドを実行できます。

#!/bin/bash

echo 「どのオペレーティング システムが好きですか?」

Ubuntu LinuxMint Windows8 Windows10 WindowsXPでOSを選択
する
  $os の場合
    "Ubuntu"|"LinuxMint")
      echo "$os も使用します。"
    ;;
    「Windows8」 | 「Windows10」 |
      echo 「Linux を試してみませんか?」
    ;;
    *)
      echo "無効なエントリです。"
      壊す
    ;;
  イーサック
終わり

上の例では、「case」はユーザーが選択したさまざまな項目に対してさまざまなコマンドを実行します。

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0