GNU/Linux >> Linux の 問題 >  >> Linux

Bashスクリプティングパート2–例を含むforループとwhileループ

このBashスクリプトチュートリアルの最初の部分では、Bashスクリプトの記述方法について説明しました。 Bashスクリプトが役立つさまざまな使用法と独自のシナリオを検討し、それらがどれほど素晴らしいものであるかを示す良い例を示しました。

チュートリアルのこの部分では、 forを見ていきます。 コマンド、および while 指図。これらのコマンドを使用して、一連の値を反復処理するループを作成する方法を示します。

Forループ

Linuxでは、ループは、指定された間隔でコマンドを繰り返し実行するために使用するものです。ループは、同じ目的でさまざまなプログラミング言語で使用されます。

Linuxには複数の異なるタイプのループがありますが、記事のこのセクションでは、 forに焦点を当てます。 ループ。

#!/bin/bash

 for y in a b c d w x y z 

> do

> echo $y

done

上のスクリーンショットでわかるように、「y」変数(コマンドのために使用される意味のないプレースホルダー)は、アルファベットの数文字に起因すると考えられます。

次に、その変数を echoに渡しました。 コマンドを実行すると、以下の文字を出力できました。

単純な値の反復

forを使用できます Bashスクリプトのコマンド。これを行うには、最初にLinuxターミナルでテキストファイルを作成する必要があります。 touchを利用できます テキストファイルを簡単に作成するためのコマンド。

$ touch script

上記の構文では、「スクリプト」と呼ばれるテキストファイルが作成されます。必ず.shを使用してテキストファイルを作成してください ファイル拡張子。 scriptを作成するとき 、 forを含む実際のスクリプトで編集する必要があります コマンド。

これは、 nanoなどのいくつかの異なるテキストファイル編集コマンドを実行することで実現できます。 コマンド、および vi コマンドなど

ただし、 nanoを使用することをお勧めします 、Linuxで最もシンプルで使いやすいコマンドテキストエディタの1つです。

$ nano script

上記の構文により、 scriptが開きます。 nanoテキストエディタで。ここでは、スクリプトを入力します。

このテキストファイルには#!/ bin / bashが含まれている必要があることに注意してください 、これは使用するシェルについてBashスクリプトに通知するため、Bashスクリプトを正常に作成するための極めて重要なコンポーネントです。

#!/bin/bash

for var in first second third fourth fifth; do

	echo The $var item

done

複素数値の反復

前の例では、 forの使用方法を示しました ユーザーが作成したBashスクリプトで単純な値を反復処理するコマンド。ここでの単純な単語は、1つの単語のみを含む値を指します。

ただし、前の例で「first」を使用して見たものの代わりに、「first」の行に沿ったものを含むリストが表示される場合があります。これには、1つの値に対して複数の単語が含まれています。これらの値は、「複雑な」値と呼ばれるものです。

リストにこれらの複雑な値が含まれている場合は、引用符で囲んで参照する必要があります。これにより、スクリプトはそれが1つの値であると認識します。

#!/bin/bash

for var in first "the second" "the third" "I’ll do it"; do

	echo "This is: $var"

done

コマンド置換

forでコマンド置換を使用することもできます Bashスクリプトのコマンド。

#!/bin/bash

my_file="file01"

for var in $(cat $my_file); do

        echo " $var"

done

ここでは、 $()内でcatコマンドを使用することでわかるように、Bashサブシェルでコマンド置換を使用しました。;これにより、 catからの出力を使用できるようになります コマンドを実行し、各行に1つの単語があると想定してファイルの内容を取得します。

ただし、これらの行の1つにスペースがある場合、すべての単語がフィールドと見なされます。この場合、新しい行をスペースではなく区切り文字として扱うようにシェルに指示する必要があります。

フィールドセパレーター

デフォルトでは、次の文字はBashシェルによってフィールドと見なされます。

  • スペース
  • タブ
  • 改行

テキストにこれらの文字のいずれかが含まれている場合、シェルはそれが新しいフィールドであると見なします。これらの文字を使用する必要がある場合は、内部フィールドセパレータまたはIFS環境変数を変更する必要があります。

$ IFS=$’n’

上記の構文により、Bashシェルは新しい行をスペース文字ではなく区切り文字と見なします。

#!/bin/bash

file="/etc/passwd"

IFS=$'n'

for var in $(cat $file); do

	echo " $var"

done

IFS を使用して、フィールド区切り文字をコロンに割り当てることもできます。 以下に示すように。

$ IFS=:

かなり素晴らしいですね

ディレクトリファイルの反復

forを使用することもできます Bashスクリプトをループして、ホームディレクトリ内のファイルを一覧表示します。

#!/bin/bash

for obj in /home/ubuntu/*; do

	if [ -d "$obj" ]; then

		echo "$obj is a folder"

	elif [ -f "$obj" ]; then

		echo "$obj is a file"

	fi

done
をエコーし​​ます。

このプロセスでは、 ifを利用する必要があります ファイルとフォルダをチェックするステートメント。ただし、前の投稿を読んだことがあれば、それはあなたにとって大きな問題にはならないはずです。ただし、万が一、復習が必要な場合は、確認することをお勧めします。

for を含むBashスクリプトでは、アスタリスク(*)と呼ばれるワイルドカードを使用しました。 ホームディレクトリ内のファイルとフォルダを一覧表示できるループ。 Bashスクリプトでは、このプロセスは「ファイルグロブ」と呼ばれます。 。」ファイルグロブとは、名前の付いた既存のすべてのファイルを意味します。

ifの変数に注意してください ファイル名またはフォルダー名にスペースが含まれている可能性があるため、ステートメントは引用符で囲んで記述されます。この手順を省略した場合、すべてのファイルとディレクトリを一覧表示できなかった可能性があります。

ファイル行を反復処理する

forを使用できます Bashスクリプトをループして、ファイルの内容を繰り返し処理します:

#!/bin/bash

IFS=$'n'

for text in $(cat /etc/passwd); do

	echo "This line $text ++ contains"

	IFS=:

	for field in $text; do

		echo " $field"

	done
done

ここでは、2つのループがあります。最初のループはファイルの行を反復処理し、セパレーターは新しい行であり、2番目の反復は行自体の単語を反復処理し、セパレーターはコロンです:

ファイルデータ

このアイデアは、CSVファイルまたはコンマ区切り値ファイルがある場合に適用できます。考え方は同じです。必要に応じてセパレータを変更するだけです。

ForループCスタイル

C言語に精通している場合は、 forについて少しずれていることに気付くかもしれません。 Linuxでは時々ループします。

これは、 forを作成する方法が2つあるためです。 ループ;このチュートリアルの冒頭ですでに説明した標準のLinuxの方法と、「Cスタイル」の方法。

for (var= 0; var < 5; var++)

{

printf(“number is %dn”, var);

}

上記の構文は、 for用です。 Cで書かれたループ。Cスタイルのfor Linuxのループは、これと非常によく似ていますが、いくつかの小さな変更があります。これは、以下で確認できます。

for((変数=開始;条件;反復ステップ))

for (( var = 1; var < 5; var++ ))

絵をよりよく描くために、Cスタイルの forを使用したBashスクリプトの例を含めます。 Linuxターミナルでループします。

#!/bin/bash

for ((var = 1; var <= 10; var++)); do

	echo "number is $var"

done

これをテキストファイルに入れて起動します。

続行コマンド

バッシュの続行 commandは、現在の反復の外側のループ内のコマンドを無視し、次の反復に制御を与えます。このコマンドを使用すると、ループを終了せずに、ループ内の残りのコマンドの実行を停止できます。

次のいくつかの例では、このコマンドをLinuxのBashスクリプトループで使用する方法について説明します。

ブレークコマンド

breakコマンドを使用して、whileループやuntilループなどの任意のループを終了できます。

#!/bin/bash

for number in 10 11 12 13 14 15; do

	if [ $number -eq 14 ]; then

		break

	fi

	echo "Number: $number"

done

ループは14に達するまで実行され、コマンドはループを終了します。
このコマンドの例については、少し後で説明します。

Whileループ

forループは、Bashスクリプトでループする唯一の方法ではありません。 while loopは同じ仕事をしますが、すべての反復の前に条件をチェックします。 whileの構造 ループは以下で見ることができます。

while [ condition ]

do

    commands

done

Bashスクリプトの例を示します。

#!/bin/bash

number=10

while [ $number -gt 4 ]; do

	echo $number

	number=$(($number - 1))

done

このBashスクリプトが機能する方法は単純です。 whileで始まります 数値がゼロより大きいかどうかを確認するコマンドを実行すると、ループが実行され、数値は毎回1ずつ減少します。ループが繰り返されるたびに、スクリプトは数値の値を出力します。ループは、その数が0に達するまで実行されます。

ネストされたループ

while のように、他のループ内にループを作成できます たとえば、ループします。ループ内のこれらのループは、ネストされたループと呼ばれます。まず、ネストされた for を作成する方法を調べて、これらについて詳しく説明します。 次の例ではループします。

複数のforループ(ネストされている)

このチュートリアルのこれまでの例では、 forを作成する方法を示しました。 LinuxのBashスクリプトでループします。しかし、ネストされた forと呼ばれるものもあります ループします。簡単に言うと、これらは他のループ内のループ、または単に複数のループです。

これがどのように見えるかの簡単な例を、簡単な調査と説明とともに以下に示します。

for y in a b c d e f

do

    for u in a b c d e f

    do

        echo "$y$u"

    done

done

上のスクリーンショットでわかるように、Linuxコマンドラインターミナルでスクリプトを実行したときに受け取る出力は、次のようになります。各 forのテキスト例 ループは「abc def」です。

スクリプトが行うことは、内側のループからのテキストと一緒に外側のループのテキストをエコーすることです。

スクリプトは、内側のループに含まれるすべてのフィールドが出力されるまで、外側のループのテキストの最初のフィールド(この場合はスペース、これについては後で説明します)を出力し続けます。

内側のループの出力が完了すると、Bashスクリプトは外側のループのテキストの次のフィールドの出力を開始します。

このプロセス全体は、各ループのすべてのフィールドがLinux端末の出力に完全に出力されるまで繰り返されます。

複数のwhileループ(ネストされたwhile)

ネストされたforのように コマンドループ、ネストされた whileも存在します コマンドループ。これらは、 forのネストされたループとまったく同じように機能します 指図;別のループ内のループ。

以下の構文は、通常の whileと非常によく似ています。 ネストされたwhileの構造としてのループ ループは、ベースの whileの単なる拡張形式です。 ループ。これは、以下の構文で確認できます。

while [condition]

do 

  statements1 

  statements2

  while [condition]

do

  continue

done

  statements3

done

上記の構文は、選択した条件が満たされるまで、指定されたタスクを実行します。これはいわゆるループです。ただし、上記の例のループはネストされているため、これは、上記のタスクの1つが別のループ自体であることを意味します。

次へ

while ループとfor ループは、LinuxでBashスクリプトを使用して複雑なプロセスを実行する場合に非常に役立ちます。

ただし、さまざまな理由で、Bashスクリプトのループの1つを強制終了する必要がある場合があります。このシナリオは、見た目は残酷ですが、システム管理作業でよく発生します。したがって、この概念をよく理解しておくことをお勧めします。

Bashシェルでは、 break コマンドとcontinue コマンドは、Bashスクリプトループのフローを制御するために必要なツールを提供できます。

以下のいくつかの例を使用して、これらのコマンドが個別にどのように機能するかを示します。

breaを利用するための構文 whileを終了するコマンド ループは次のとおりです:

$  while [ condition ]
do
    commands
continue
done

続行 コマンドbreak コマンドは非常によく似ており、互いに反対であると見なすことができます。 続行 コマンドはbreakとまったく同じように機能します コマンド、それだけがそれを殺す代わりにループを続けます。

終了Whileループ

break コマンドは現在のループを強制終了し、そのループに続く次のコマンドに制御を与えます。このプロセスを利用して、 forなどのループを終了できます。 、 while 、など。 breakの構文 コマンドは次のとおりです:

$ while [ condition ]
do
    commands
break
done

ただし、前述のように、両方の continue コマンドとbreak コマンドは、 while以外の他のBashスクリプトループに使用できます。 ループ。 forでそれらの使用方法を示します ループ。

Exit For Loop

これらのループ制御コマンドは、 forで使用できます。 ループ。 breakを使用します forを終了するコマンド Bashスクリプトでループします。

#!/bin/bash

for number in 10 11 12 13 14 15; do

	if [ $number -eq 14 ]; then

		break

	fi

	echo "Number: $number"

done

for ループは、bashスクリプトで指定した数(14)に達するまで実行されます。指定した数に達すると、 break コマンドはforを終了します ループ。

BreakIfステートメント

breakの使用方法を示しました forを終了するコマンド ループしますが、このコマンドを使用して ifを終了することもできます これらのBashスクリプトループ内のステートメント。

i=0

while [[ $i -lt 10 ]]

do

  echo "Number: $i"

  ((i++))

  if [[ $i -eq 5 ]]; then

    break

  fi

done

継続ステートメント

前の例で行ったのと同じことをcontinueで行います breakで行ったようにコマンド whileのコマンド Bashスクリプトでループします。

i=0

while [[ $i -lt 10 ]]; do

  ((i++))

  if [[ "$i" == '5' ]]; then

    continue

  fi

  echo "Number: $i"

done
を続行します

まとめ

あなたが新しいことを1つか2つ学んだことを願っています。または、少なくとも、あなたがすでに知っていることを確認できたと思います。今日の私の最後の言葉は、読み続けて練習することです。

ありがとうございます。


Linux
  1. BashForループガイドと例

  2. Linuxスクリプト:Bashでのwhileループの3つのハウツー

  3. Bash の「test」コマンドでの「&&」と「&」の比較

  1. 例を使用したBashヒアドキュメントチュートリアル

  2. Linux which and whoami初心者向けコマンドチュートリアル(例付き)

  3. Bash の For ループと While ループの例

  1. 初心者向けのLinuxグループコマンド(例付き)

  2. 初心者向けのLinuxtrコマンドチュートリアル(例付き)

  3. 初心者向けのLinuxreadlinkおよびrealpathコマンドチュートリアル(例付き)