\r\n\r\n

Linuxにおけるbashのforループの全知識

bash は強力なスクリプトツールであり、Linux システムのバックボーンです。ここでいくつかの基本を学びましょう。

Bashスクリプトは、特に他の既存プログラムを利用したタスクを自動化する効率的な方法です。この自動化には、通常、同じような操作を何度も繰り返す必要があり、そこで、forループの出番となる。

LinuxやMacのシステム管理者は、通常ターミナルを使ったスクリプティングに慣れていますが、WindowsユーザーでもLinux用のWindowsサブシステムを使ってスクリプティングを行うことができます。

bashスクリプトの仕組み

bashスクリプトは、bashシェルが読み込んで実行できる一連のコマンドを含むプレーンテキストファイルです。bashは、以前のバージョンのcatalinamacosとほとんどのLinuxディストリビューションのデフォルトのシェルです。

シェルスクリプトを使ったことがない人は、まず一番簡単なケースから始めてみてください。これにより、スクリプトの作成と実行を含む重要な概念を練習することができます。

まず、以下のファイルを使いやすい場所に作成します(最初にターミナルを開き、目的のディレクトリに移動するのが理想的です)。

#!/bin/bashecho "Hello, World"

最初の行は、プログラムを実行する人に、その実行方法(つまりbashインタプリタを使うこと)を伝えます。2番目のコマンドは、コマンドラインから入力する他のコマンドと同じです。hello_world.sh として保存し。

$ chmod +x hello_world.sh$ ./hello_world.sh

1行目のchmodコマンドは、2行目に示すように、ファイル名を入力することで実行可能な状態にします。

ターミナルの行に「Hello, World」という文字が表示されれば、すべてが要求通りに動作していることになります。

forループの仕組み

一般的なプログラミングでは、forループには主に数値型とforeach型の2種類がある。伝統的には数値型が最も一般的だが、bashの使い方では通常その逆である。

数値のforループは通常、何回繰り返されるかを決定する1つの整数に注目します。

for (i = 0; i < 100; i++) { /* statements to execute repeatedly */}

これはおなじみのルックアップループで、ループ内で私が変更されるか、他のステートメントによってforループの実行が停止されない限り、正確に100回反復されるものです。

一方、Foreachループはリストや配列のような構造体を操作し、セット内の各項目を反復処理する傾向があります。

people = [ "Peter", "Paul", "Mary" ]foreach (people as person) { if (person == "Paul") { ... }}

言語によっては、セットとアイテムの順番を入れ替えるために、少し異なる構文を使うものもあります。

people = [ "Peter", "Paul", "Mary" ]for (person in people) { if (person == "Paul") { ... }}

For in loops

bashでは、foreachやfor Inループがより一般的である。

for arg in [list]do /* statements to execute repeatedly */ /* the value of arg can be obtained using $arg */done

例えば、明示的に名付けられた3つのファイルに対して反復処理を行う場合。

for file in one.c two.c three.cdo ls "$file"done

そのようなファイルがカレントディレクトリに存在する場合、このスクリプトの出力は次のようになります。

one.ctwo.cthree.c

固定されたファイル群の代わりに、グロブパターン(ワイルドカード(他の文字を表す特殊文字)を含む)を用いてリストを得ることができます。次の例では、forループは、名前が".xml "で終わるすべてのファイル(カレントディレクトリ内)を繰り返し処理する。

for file in *.xmldo ls -l "$file"done

以下は出力例です。

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

これは非常に長大なアプローチに見えます:。

$ ls -l *.xml

しかし、1つだけ大きな違いがあります。forループは、lsプログラムを2回実行し、その度に1つのファイル名だけを渡します。lsの例では、まずglobパターン(*.xml)がファイル名にマッチし、次にすべてのファイル名を別々のコマンドライン引数としてlsのインスタンスに送っています。

以下は、その違いをより明確にするために、wc(word count)の手順を用いた例である。

$ wc -l *.xml44 feed.xml231 sitemap.xml275 total

wc プログラムは、各ファイルの行数を個別にカウントし、全行数の合計を表示します。これに対し、wc を for ループで実行した場合。

for file in *.xmldo wc -l $filedone

各ドキュメントのカウントは表示されたままです。

44 feed.xml231 sitemap.xml

しかし、wcはループの反復ごとに独立して実行されるため、総まとめのサマリーはありません。

リストがリストでない場合

bashが引用符で引数/文字列を処理する方法のため、forループの処理で非常に単純でよくあるエラーがあります。ファイル一覧のループ再生は次のように行います。

for file in one.c two.c

そうではありません。

for file in "one.c two.c"

2番目の例では、ファイル名を二重引用符で囲んでいるため、引数が1つだけのリストとなり、forループが一度だけ実行されます。この問題は、次のような場合に変数を使用することで回避することができます。

FILES="one.c two.c"for file in $FILESdo ...done

変数の宣言自体は、その値を二重引用符で囲む必要があることに注意してください!

リストがないため

反復可能なコンテンツがないため、forループはスクリプトが呼び出されたときに与えられたコマンドライン引数で動作します。例えば、次のような内容のargs.shというファイルがあった場合。

#!/bin/shfor ado echo $adone

その後、args.shファイルを実行すると、次のような情報が得られます。

$ ./args.sh one two threeonetwothree

Bashはこの状況を認識し、doをfor in$@doと同等に扱います。ここで$@はコマンドラインの引数を表す特殊な変数です。

従来のデジタルフォールプをシミュレート

Bashスクリプトは通常、ファイルのリストや他のコマンドからの出力行を扱うので、for-inタイプのループが一般的です。しかし、従来のc型操作も引き続きサポートされています。

for (( i=1; i<=5; i++ ))do echo $idone

3つのパートで構成される古典的な形式です。

  1. 変数はループに最初に遭遇したときに初期化される (i=1)
  2. 条件(i<=5)が真である限り、ループは継続する
  3. ループ毎に変数がインクリメントされる(i++)。

2つの値の間を反復処理することは非常に一般的な要件なので、より短く、やや混乱しにくい代替案があります。

for i in {1..5}do echo $idone

このとき発生するブレースの拡張は、上記のforループを効果的に変換する。

for i in 1 2 3 4

割り込み・レジュームによるきめ細かなループ制御

より複雑なforループでは、メインループを早期に終了させたり、次の値ですぐに再開させたりする方法が必要になることが多い。そのためにbashは、他のプログラミング言語で一般的なbreak文とcontinue文を借用しています。次の例では、この2つの方法を用いて、100文字以上の最初のファイルを検索しています。

#!/bin/bashfor file in *do if [ ! -f "$file" ] then echo "$file is not a file" continue fi num_chars=$(wc -c < "$file") echo $file is "$num_chars characters long" if [ $num_chars -gt 100 ] then echo "Found $file" break fidone

ここでのforループは、カレントディレクトリにあるすべてのファイルに対して操作しています。通常のファイルでない場合(例えばディレクトリの場合)、continue文を使って次のファイルから順番にループを再開します。通常のファイルであれば、2番目の条件ブロックで100文字以上含まれているかどうかを判断します。その場合、break文はforループをすぐに抜ける(スクリプトの最後に到達する)ために使用されます。

結論

bashスクリプトは、実行可能な命令群を含むファイルである。forループは、スクリプトの一部を複数回繰り返すことができる。bashスクリプトは、変数、外部コマンド、break文、continue文などを利用することで、より複雑なロジックを適用し、幅広いタスクを実行することができます。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ