Bashシェルスクリプトでは、ループは反復的なタスクを自動化するのに役立ちます。スクリプトでタスクをN回繰り返す必要がある場合は、ループを使用する必要があります。 bashでサポートされているループには3つのタイプがあります。
- Forループ
- ループ中
- ループするまで
3つのループはすべて、条件が満たされたときにタスクをN回繰り返すという同じ目的を果たしますが、結果を達成するための定義と使用方法が異なります。
この記事では、Bashスクリプトの「forループ」に焦点を当てます。他の2つのループについては、次のガイドで学習します。
Forループ構文
最初のforループ
を作成する前に、構文を理解することが非常に重要です。 。
for NAME in [ LIST OF ITEMS ] do Command 1 Command 2 ..... Command N done
それを分解して、それが何をするか見てみましょう。
- キーワード
"for"
から始めます 後に変数名が続きます。 - キーワード
"in"
アイテムのリストを取得し、反復ごとに変数に格納します。 - キーワード
"do"
および"done"
ループブロックの開始と終了をマークします。コマンドはdoとdone内に記述する必要があります。 - 厳密なインデント規則はありませんが、読みやすくするために2つのスペースを使用してください。 またはtab(4) 。スクリプト全体でスペースまたはタブのいずれかを一貫して使用してください。
ループの単一行を作成することもできます。 forループ
を作成します ターミナルで上矢印キーを押すと、bashが自動的に単一行ループに変換するのがわかります。
for NAME in [ LIST OF ITEMS]; do COMMANDS ; done
例1-アイテムのリストの操作
簡単な例から始めましょう。
前のセクションから、forループ
を理解しているかもしれません。 アイテムのリストを受け入れます。アイテムのリストは、文字列、配列、整数、範囲、コマンド出力など、何でもかまいません。
ターミナルを開き、次のコードを実行します。
N=1 for val in Welcome To Ostechnix do echo "Iteration $N → $val" ((++N)) done
分解しましょう。
「WelcometoOstechnix」
for loop
に渡されるアイテムのリストです 各単語は個別の反復として選択され、変数(val
)に格納されます。 。- 変数には任意の名前を付けることができます。ここでは、
val
という名前を付けています。 。 - リストには3つの項目があるため、
forループ
には3つの反復があります。 変数val
の値が毎回 印刷されます。 - コマンド((
++ N
)) カウンターとして機能し、変数値N
をインクリメントします そのため、echo
で印刷できます ステートメント。
上記のforloop
を実行した後 コマンドをターミナルから上矢印キーを押すと、複数行の for loop
が表示されます。 ループの場合は1行に変換されます。
例2-範囲の操作
forループ
を実行することをお勧めします N そのために、bash組み込みシーケンスジェネレーター "{x..y [.. incr]}"
を何度も使用できます。 一連の数字が生成されます。
-
X
=開始整数値 -
Y
=終了整数値 -
Incr
=整数の増分を行うオプションの整数値
forループを5回実行したい場合は、次のスニペットを使用できます。
for rng in {1..5} do echo "Value is == $rng" done
ステップワイズインクリメントを行うオプションのインクリメントパラメータを使用することもできます。
以下のスニペットを見てください。ここでは、3の増分が示されています。これにより、1からシーケンスが生成され、終了値が10になるまで3のステップ増分が実行されます。
for rng1 in {1..10..3} do echo "Value is == $rng1" done
例3-コマンドの実行
for loop
で処理されるアイテムのリストを取得する任意のコマンドを実行できます。 。コマンドは、ティック「 ``
で囲む必要があります "または角かっこ"$()
"。
次の例では、プロセスIDを取得し、最後の5つのプロセスをフィルタリングするコマンドを実行しています。 forループは各プロセスIDを反復処理します。
for list in $(ps -ef | awk {' print $2 '} | tail -n 5) do echo $list done
例4-配列要素をループする
リアルタイムのシナリオでは、いくつかの値を配列に格納し、さらに処理するために配列をループしようとします。
配列を反復処理する方法を理解する前に、2つの特別な変数( [email protected]
)の動作を理解する必要があります。 および$*
)。これらは両方とも、配列からすべての要素にアクセスするために使用される特別な変数です。
ターミナルで次のコードを実行します。配列X が作成され、すべての値を出力しようとすると( $ X
)変数を出力する方法と同様に、配列から最初の値を返すだけです。
$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16
配列内のすべての要素にアクセスするには、 [email protected]
を使用する必要があります または$*
。配列値にアクセスするための構文は次のとおりです。
$ echo ${X[@]}
16 09 2021 Thursday Third Week
$ echo ${X[*]}
16 09 2021 Thursday Third Week
これをforloop
で使用します 配列値を反復処理します。
X=( 16 09 2021 "Thursday Third Week" ) for items in ${X[@]} do echo $items done
上記の出力を見てください。配列内の文字列(Thursday Third Week)は単一の値と見なされる必要があるため、この出力は間違っているようです。ただし、ここでは各アイテムが個別のアイテムとして扱われます。
これは、 [email protected]
を使用する場合のデフォルトの動作です。 または$
。これを克服するには、配列拡張変数を囲みます( [email protected]
または$
)二重引用符で囲みます。
for items in "${X[@]}" do echo $items done
二重引用符を使用する場合は、 [email protected]
および$*
動作が異なります。 [email protected]
上記の例のように、配列を配列内の各アイテムに展開します。 $ *
配列全体を1つの値として展開します。
for items in "${X[*]}" do echo $items done
ヘッズアップ: 両方の[emailprotected]
および$*
二重引用符で囲まれていない限り、同じように動作します 。 $ *
は避けてください 必要でない限り。
例5-Cスタイルのforループ構文
Bashはcも提供しています スタイルforloop
構文。 Cからの場合 言語のバックグラウンドがあれば、この構文は新しいものではありません。
リストを反復処理する代わりに、条件を評価し、条件がtrueの場合、ループ内のコマンドが実行されます。
この構文で理解する必要のある3つのパラメーターがあります。
- 変数 -変数は、ループがトリガーされたときに1回だけ初期化されます。
- 状態 -ループを実行するには、条件が真である必要があります。そうでない場合、ループは実行されません。
- カウンター -これにより、変数値がインクリメントされます。
各パラメータはセミコロンで区切る必要があります (;コード> )、二重角かっこで囲む必要があります 以下に示すように。
for (( variable; condition; counter )) do Command 1 Command 2 Command N done
以下のうるう年の例をご覧ください。
- 変数
YEAR=2010
最初に初期化されます。 - 条件
YEAR<=20
評価され、それがtrueの場合、do
間のコード およびdone
ブロックが実行されます。 - カウンター
YEAR++
年を1カウントずつインクリメントします。変数YEAR
まで2020
にインクリメントされます 、ループが繰り返されます。 -
do
内 および完了
ブロック、条件ステートメントは、年がうるう年であるかどうかを確認するために記述されます。
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else echo "$YEAR = not a leap year" fi done
例6-ブレーク、ステートメントの使用を継続
ループのフローを制御するために使用される2つのbash組み込みキーワードがあります。
- 休憩 -ループを終了し、保留中の反復をスキップします。
- 続行 -現在の反復をスキップし、制御をforループに戻して、次の反復を実行します。
それらがbashに組み込まれているかどうかを確認するには、 type
を使用します コマンド:
$ type break continue break is a shell builtin continue is a shell builtin
休憩と続行の両方をどこでどのように使用できるかを簡単に見てみましょう。
前のセクションで使用したのと同じコードを使用して、うるう年を検索しています。この場合、2010年から2020年までの最初のうるう年が必要です。その年が見つかった場合、ループを終了できます。
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" break else echo "$YEAR = not a leap year" fi done
上記の出力から、 for loop
を確認できます。 繰り返し、2012年の最初のうるう年が見つかると、 break
ステートメントが読み取られ、ループが終了して、制御が端末に戻されます。
現在、 "continue"
の同じコードを変更しています 声明。 続行
ステートメントが解釈されると、現在の反復がスキップされます。つまり、continueステートメントの後に続くコードはすべてスキップされ、制御が for loop
に戻されます。 次の反復を実行します。
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else continue echo "$YEAR = not a leap year" fi done
上の画像から、continueステートメントによってスキップされたechoステートメントがあることがわかります。
例7-真のステートメントの使用法
ループまたは条件ステートメントを作成する場合、コードのブロックを空のままにすることはできません。 Bashは構文エラーをスローします。
上記の両方の画像を見てください。最初の画像では、forループ
を作成しました ただし、 do
の間にコマンドはありません および完了
。同様に、2番目の画像では、else句を空のままにしました。どちらの場合も、bashは空のブロックを受け入れず、構文エラーをスローします。
bashビルトインの“ true”
を使用できます 常に終了コードを0に設定するキーワード (成功)。
$ type true true is a shell builtin
このようにして、bashがエラーをスローすることなく、コードブロックを空のままにします。
結論
このBashforループガイドでは、ループの概要と for loop
の構文から始めました。 Cスタイルと一緒に。また、ループ制御ステートメントを中断して続行するとともに、さまざまな条件でforループを使用する方法も確認しました。 BashのWhile
については、次のガイドを確認してください。 およびUntil
例を使ってループします。
- Bashスクリプティング–ループの説明中およびループまで
関連記事:
- Bashスクリプティング–例で説明されている関数
- Bashスクリプティング–例で説明されている変数
- Linuxの例で説明されているBashEchoコマンド
- 初心者向けのBashヒアドキュメントチュートリアル
- 例を使用して説明されたBashリダイレクト
- エクスポートがある場合とない場合のBash変数の定義の違い