LinuxのBashForLoopsについて知っておくべきことすべて

LinuxのBashForLoopsについて知っておくべきことすべて

Bashスクリプトは、タスク、特に他の既存のプログラムを利用するタスクを自動化するための非常に効率的な手段です。この自動化では、多くの場合、同様の操作を数回繰り返す必要があります。 forループ 独自になります。





LinuxおよびMacシステム管理者は通常、ターミナルを介したスクリプト作成に精通していますが、Windowsユーザーでも可能です。 Linux用のWindowsサブシステムでアクションに参加する





Bashスクリプトのしくみ

bashスクリプトは、bashシェルが読み取って実行できる一連のコマンドを含む単純なテキストファイルです。 Bashは、CatalinamacOS以前およびほとんどのLinuxディストリビューションのデフォルトシェルです。





これまでシェルスクリプトを使用したことがない場合は、最も単純なケースから始める必要があります。これにより、スクリプトの作成とその実行を含む重要な概念を練習できます。

まず、便利な場所に次のファイルを作成します(理想的には、ターミナルを開いて、最初に目的のディレクトリに移動します)。



#!/bin/bash
echo 'Hello, World'

最初の行は、このプログラムを実行するものに実行方法を指示します(つまり、bashインタープリターを使用します)。 2つ目は、コマンドラインで入力する他のコマンドと同じです。そのファイルを名前を付けて保存 hello_world.sh 、 それから:

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

NS chmod 最初の行のコマンドはファイルを実行可能にします。つまり、2行目のように、名前を入力することでファイルを実行できます。





「Hello、World」という単語が端末の行に印刷されている場合は、すべてが必要に応じて機能しています。

Forループのしくみ

一般的なプログラミングでは、forループには主に2つのタイプがあります。 数値foreach 。数値型は伝統的に最も一般的ですが、bashの使用法では、通常はその逆です。





数値のforループは通常、実行される反復回数を決定する単一の整数に焦点を合わせます。次に例を示します。

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

これは、ループ内でiが変更されない限り、または別のステートメントによってforループの実行が停止しない限り、正確に100回繰り返される見慣れたforループです。

対照的に、Foreachループは、リストや配列などの構造を操作する傾向があり、そのコレクション内のすべてのアイテムを反復処理します。

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

一部の言語では、コレクションとアイテムの順序を入れ替えるわずかに異なる構文を使用しています。

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

ループ内の場合

bashでは、foreach-または のために —ループがより一般的です。基本的な構文は次のとおりです。

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

たとえば、明示的に名前が付けられた3つのファイルを反復処理するには、次のようにします。

誰かのGmailアカウントがいつ作成されたかを確認する方法
for file in one.c two.c three.c
do
ls '$file'
done

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

one.c
two.c
three.c

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

for file in *.xml
do
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

ただし、大きな違いがあります。forループは ls プログラムは2回別々に行われ、毎回1つのファイル名が渡されます。別のlsの例では、globパターン(* .xml)が最初にファイル名と一致し、次にそれらすべてを個別のコマンドラインパラメーターとして次の1つのインスタンスに送信します。 ls

これは、を使用する例です トイレ (単語数)違いをより明白にするプログラム:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

NS トイレ プログラムは、各ファイルの行数を個別にカウントしてから、それらすべての合計カウントを出力します。対照的に、 トイレ forループ内で動作します:

for file in *.xml
do
wc -l $file
done

各ファイルの数は引き続き表示されます。

44 feed.xml
231 sitemap.xml

しかし、全体的な要約の合計はありません。 トイレ ループが繰り返されるたびに、は単独で実行されます。

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

bashが引用符で囲まれた引数/文字列を処理する方法が原因で、forループを処理するときに非常に簡単でよくある間違いがあります。ファイルのリストをループするには、次のようにする必要があります。

for file in one.c two.c

このようではありません:

for file in 'one.c two.c'

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

FILES='one.c two.c'
for file in $FILES
do
...
done

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

Wi-Fiは接続されていますが、インターネットアクセスウィンドウがありません7

リストなしの場合

繰り返すものが何もないため、forループは、呼び出されたときにスクリプトに提供されたコマンドライン引数に対して動作します。たとえば、という名前のスクリプトがある場合 args.sh 以下を含む:

#!/bin/sh
for a
do
echo $a
done

次に、args.shを実行すると、次のようになります。

$ ./args.sh one two three
one
two
three

Bashはこのケースを認識し、処理します するために と同等のものとして $ @で ここで、$ @は、コマンドライン引数を表す特別な変数です。

従来の数値Forループのエミュレート

Bashスクリプトは、ファイルのリストや他のコマンドからの出力行を処理することが多いため、forinタイプのループが一般的です。ただし、従来のcスタイルの操作は引き続きサポートされます。

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

これは、次の3つの部分からなる古典的な形式です。

  1. ループが最初に発生したときに変数が初期化されます(i = 1)
  2. ループは、条件(i<=5) is true
  3. ループを回るたびに、変数がインクリメントされます(i ++)

2つの値の間で繰り返すことは、より短く、少し混乱の少ない代替手段があるという十分に一般的な要件です。

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

行われるブレース拡張は、上記のforループを次のように効果的に変換します。

for i in 1 2 3 4

ブレークアンドコンティニューによるより細かいループ制御

より複雑なforループでは、多くの場合、メインループを早期に終了するか、すぐに次の値で再開する方法が必要になります。そのために、bashは他のプログラミング言語で一般的なbreakステートメントとcontinueステートメントを借用します。これは、両方を使用して100文字を超える長さの最初のファイルを見つける例です。

#!/bin/bash
for 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
fi
done

ここでのforループは、現在のディレクトリ内のすべてのファイルで機能します。ファイルが通常のファイルでない場合(ディレクトリなど)、continueステートメントを使用して、次のファイルでループを再開します。通常のファイルの場合、2番目の条件ブロックは100文字を超えるかどうかを判断します。その場合、breakステートメントを使用してforループをすぐに終了します(そしてスクリプトの最後に到達します)。

結論

bashスクリプトは、実行可能な一連の命令を含むファイルです。 forループを使用すると、スクリプトの一部を何度も繰り返すことができます。変数、外部コマンド、およびbreakステートメントとcontinueステートメントを使用すると、bashスクリプトはより複雑なロジックを適用し、さまざまなタスクを実行できます。

共有 共有 つぶやき Eメール Windows 11にアップグレードする価値はありますか?

Windowsが再設計されました。しかし、それはWindows10からWindows11に移行するように説得するのに十分ですか?

次を読む
関連トピック
  • プログラミング
  • Linux
著者について ボビージャック(58の記事が公開されました)

ボビーは、20年のほとんどの間ソフトウェア開発者として働いた技術愛好家です。彼はゲームに情熱を注いでおり、Switch Player Magazineのレビュー編集者として働いており、オンラインパブリッシングとウェブ開発のあらゆる側面に没頭しています。

ボビージャックのその他の作品

ニュースレターを購読する

ニュースレターに参加して、技術的なヒント、レビュー、無料の電子書籍、限定セールを入手してください。

購読するにはここをクリックしてください