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

シェルスクリプトパート4:繰り返し制御構造

HowtoForgeのシェルスクリプトチュートリアルシリーズのパート4へようこそ(チュートリアルのパート1、パート2、パート3を読むには、ここをクリックしてください)。このパートでは、bashシェルのさまざまな繰り返し制御構造と、各構造の使用方法をいくつかの例で説明します。始めましょう。

はじめに

ループ制御構造とも呼ばれる反復制御構造は、プログラミング言語の制御構造の一種であり、反復または再帰的なタスクを単純化するために使用されます。ループステートメントは、コードを最小化する方法を提供することでコードを最適化し、同じ出力を提供する非構造化コードよりもトラブルシューティングを容易にします。 bashシェルがサポートするループステートメントには、for、while、untilの3種類があります。

Forループ

forループは、キーワードforを使用して反復ステートメントを宣言するループステートメントです。 bashは、forループステートメントのさまざまな構文をサポートしています。

構文1:For-in構造

for <varName> in <list>
do
    #### your statement here
done

この構文は、キーワードforで始まり、変数名、キーワードin、および変数の可能な値のリストが続きます。リスト内の各値はスペースで区切られ、繰り返されるコード行の開始はdoで定義され、doneキーワードで終了します。

ユーザーが5つの値を入力し、数値の合計を取得できるようにする、単純なforloopingステートメントを作成してみましょう。

#!/bin/bash 
result=0;
input=0;
for var in 1 2 3 4 5
do
     printf "Input integer %d : " $var
     read input
     result=$((result+input))
done
echo "the result is " $result

この例では、変数varがループのカウンターとして機能します。その値は、キーワードinの後の数値リストで定義され、シェルは、ループステートメントでサイクルが実行されるたびにvar変数の値を変更します。リストには整数値が5つしかないため、シェルはループステートメント内のコードを5回だけ実行します。

構文2:文字列リスト値を使用してステートメントをループする場合

カウンターのアイテムのリストを保持する変数を宣言することもできます。たとえば、次のコードについて考えてみます。

#!/bin/bash
list="var1 var2 var3 var4"
var=""
mkdir sample
cd sample
echo creating the "directories...."
for var in $list
do
     mkdir $var
done

行list="var1 var2 var3 var4"は、リスト変数の値を定義します。次に、$ listのvarの行でvarに割り当てられ、最後にmkdir$varの行にディレクトリが作成されます。

構文3:ファイルとしてリストを使用するForループステートメント

catコマンドを使用してコード内で宣言する代わりに、ループステートメントで使用する既存のファイルからリストを取得することもできます。たとえば、お気に入りのテキストエディタを開いて、少なくとも5つのディレクトリ名をリストします。

次に、同じテキストエディタで新しいタブを開き、新しいスクリプトを作成します。このスクリプトは、以前に作成したディレクトリのリストが保存されているのと同じディレクトリに保存する必要があります。

#!/bin/bash 
dirList=$(cat list)
echo "creating directories...."
for var in $dirList
do
mkdir $var
done

この例は、Linuxコンピュータに何百ものディレクトリを作成する必要がある場合に便利ですよね?

構文4:Cのような構文

for((initialization; boolean_test; increment/decrement))
do
#### your code goes here
done

おそらく、シェルがサポートするforループの最もよく知られた構造は、Cのような構造です。ループはカウンター変数の初期化から始まり、シェルは初期化後に宣言されたブール式を評価します。ブール式の結果がtrueの場合、シェルはdo句内のステートメントのセットを実行します。それ以外の場合、シェルはループステートメントを終了し、doneキーワードの後の行に進みます。シェルは、ブールテストの後に宣言されたインクリメントまたはデクリメントステートメントを介して次の反復に進みます。例として、この構造を使用して最初の例を再構築してみましょう。

#!/bin/bash 
result=0
input=0
for((var=1;var<=5;var++))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
done
echo $result

ステートメントをループしている間

whileステートメントは、キーワードwhileを利用するbashの反復構造の一種です。 forループ構造のCタイプの構文とは異なり、while反復制御構造は、初期化、ブールテスト、およびインクリメント/デクリメントステートメントを分離します。

構文1:算術記号を使用した構造体ベースの条件文

<initialization>
while(condition)
do
    ###your code goes here
<increment/decrement>
done

whileを他のループステートメントと区別できるようにするために、whileステートメントの最初の例を作成しましょう。

#!/bin/bash
result=0
input=0
var=1
while((var <= 5))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

この例を見ると、whileステートメントはカウンター変数varの初期化から始まります。次に、ブールテストがキーワードwhileの後に宣言され、繰り返されるステートメントのセットがdoおよびdoneステートメント内で宣言されます。 whileステートメントでは、ブールテストの結果がtrueの場合にのみ、インタープリターがコードの繰り返しを開始して実行します。一方、ループステートメントのwillステートメントは、ブール式の結果がfalseの場合にのみコードの反復を終了します。

構文2:ニーモニックベースの条件付きステートメントを使用したWhileループステートメント

<initialization>
while [ <condition> ]
do
####your code goes here
<increment/decrement>
done
>

whileループステートメント内でニーモニックベースの条件ステートメントを宣言することもできます。宣言には、括弧の代わりに角括弧が使用されます。 (ここでニーモニックベースの条件ステートメントを確認してください)例:

#!/bin/bash 
var=1;
while [ $var -le 5 ]
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

構文3:ファイルベースの条件付きステートメントでステートメントをループしている間

while read <variable_name>
do
####your code goes here
done <<path to the text file>

for loopingステートメントで行ったのと同じように、テキストファイルを開いてwhileloopingステートメントに関連付けることもできます。例:

#!/bin/bash 
mkdir sample2
cd sample2
echo "creating directories..."
while read var
do
    mkdir $var
done<list

この例では、しばらく前に作成したリストをリサイクルし、同じディレクトリに新しいスクリプトを作成しました。テキストファイルが別のディレクトリにある場合は、<記号の後にファイルの正確なパスを指定する必要があることに注意してください。

ループステートメントまで

bashがサポートするもう1つのタイプのループステートメントは、until構造です。 untilステートメントは、ブール式で宣言された結果がfalseになるまで、ループ内のすべてのコマンドを実行します。これは、whileステートメントの正反対です。

構文1:算術記号ベースの条件文を使用したループまで

until ((<conditional_statement>))
do
####set of commands
done

例を見てみましょう:

result=0 
input=0
var=1
until((var > 5))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

構文2:ニーモニックベースの条件付きステートメントでステートメントをループするまで

<initialization>
until [ <condition> ]
do
     ####your code goes here
<increment/decrement>
done
>

untilステートメントはwhileループステートメントの正反対であるため、until構造体でニーモニックベースの条件ステートメントを宣言することもできます。ただし、終了するには、反対の条件ステートメントを宣言する必要があります。つまり、条件ステートメントをfalseと評価します。

!/bin/bash 
result=0
input=0
var=1
until [ $var -gt 5 ]
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result

結論

このチュートリアルパートでは、bashがサポートする3つのループ構造(for、while、until)のループステートメントについて説明します。これらの各ステートメントには、異なる構造、使用法、および利点があります。 bashはさまざまな構造をサポートしているため、プログラマーはより多くの選択肢を利用できるため、シェルスクリプトを簡単にコーディングできます。


Linux
  1. ファイル記述子とシェルスクリプト?

  2. シェルが知っているすべてのコマンドを一覧表示しますか?

  3. AptまたはApt-getInShell Scriptingを使用する必要がありますか?

  1. Linuxでシェルスクリプトを使用してJsonを解析する方法は?

  2. シェルスクリプトのステートメントブロックメカニズム?

  3. シェルスクリプトでの検索と置換

  1. Bashシェルスクリプトで文字列を比較する方法

  2. Linux シェル スクリプト用の 12 の Bash for ループの例

  3. Linux シェル スクリプトでのバックティック (`) 記号