ウェブサイト検索

Bashでループを実装する方法


ループは、あらゆるプログラミング言語の主要な部分です。 「for」、「foreach」、および「while-do」ループは、Bashでさまざまなプログラミング問題を解決するために使用されます。繰り返しのタスクのほとんどは「for」ループを使用して実行でき、主にループを有限回数繰り返すために使用されます。「while」ループは、ループの繰り返し回数が事前に定義されていない場合に主に使用されます。このチュートリアルでは、複数のBashスクリプトを使用して、「for」ループと「while」ループの異なる使い方が示されています。

目次:

    1. 文字列を読み取るための「for」ループの使用
    2. データリストを読み取るための「For」ループの使用
    3. 配列を読み取るための「for」ループの使用
    4. 値の範囲を読み取るための「For」ループの使用
    5. 3つの式「for」ループを使用してスクリプトを反復処理する
    6. 無限の「for」ループの使用
    7. break文を使った「for」ループの使用
    8. Continue文を使った「for」ループの使用
    9. コマンドライン引数を読み取るための「for」ループの使用
    10. 連想配列を読むための「for」ループの使用
    11. 「Seq」を使った「For」ループの使用
    12. コマンドを使った「for」ループの使用
    13. 入れ子の「for」ループの使用
    14. ファイルを読み込むための「while」ループの使用
    15. 複数の条件を持つ「While」ループの使い方

テキストを読み取るための「for」ループの使用

「for」ループの最も簡単な使い方は、以下のスクリプトに示されています。ループによって3つの単語の文字列が解析され、各行に各単語が印刷されます。

#!/bin/bash

Read each word of the text
for val in Bash Scripting Language
do
   #Print the parsed value
   echo $val
done

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

データのリストを読むための「for」ループの使用

「for」ループを使用してデータのリストを印刷する方法は、以下のスクリプトに示されています。ここでは、ループを使用して4つのリスト項目が解析され、各項目が各行に印刷されます。

#!/bin/bash

#Read the list of data
for val in "Bash" "Python" "Perl" "PHP"
do
    #Print each value of the list
    echo $val
done

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

配列を読むための「For」ループの使用

数値配列の各要素を「for」ループを使用して読む方法は、以下のスクリプトに示されています。スクリプト内で四つの要素からなる配列が宣言されており、ループは配列の各値を解析し、それを各行に印刷します。

#!/bin/bash

#Declare an numeric array
declare -a products=( 'HDD' 'Monitor' 'Mouse' 'Keyboard' )

echo "Array values are:"
for val in "${products[@]}"
do
    #Print each array value
    echo "$val"
done

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

値の範囲を読むための「for」ループの使用

以下のチュートリアルでは、値の範囲を持つ「for」ループを使用して、5つの入力数の合計を計算する方法が示されています。「$sum」変数は、ここで合計結果を保存するために使用され、ループを反復してユーザーから入力を受け取る前に0に初期化されます。各反復でユーザーから5つの数が取り出され、数の合計が計算されます。

#!/bin/bash

#Initialize the variable
sum=0

#Iterate the loop for 5 times
for n in {1..5}
do
   #Take a number from the user
   echo -n "Enter a number: "
   read num
   #Calculate the sum of the number
   ((sum+=$num))
done

#Print the sum of the numbers
echo "The sum of 5 numbers is $sum."

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

三つの式の「for」ループを使ってスクリプトを繰り返します

三項式の「for」ループは、すべてのプログラミング言語で「for」ループを使用する従来の方法です。以下のスクリプトは、Bashにおける三項式「for」ループの使い方を示しており、配列の値を出力します。

#!/bin/bash

#Declare an array of 4 elements
declare -a names=("Kamal" "Sabbir" "Zinia" "Jaber" "Jafar")

#Count the total elements of the array
len=${#names}

#Print the array values
echo "Array values are:"
for (( i=0; i<$len; i++ ))
do
    #Print each value of the array
    echo "${names[$i]}"
done

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

無限「for」ループの使用

無限ループを定義するための三つの式からなる「for」ループの使用法は、以下のスクリプトに示されています。このループはユーザーが「Ctrl+C」を押すまで無限に繰り返され、入力値を取得し、各イテレーションでその値を出力します。

#!/bin/bash

#Define an infinite loop
for (( ; ; ))
do
   #Take input from the user
   echo -n "Type a number: "
   read num
   #Print the input value
   echo "You have entered $num."
   #Print message for terminating the loop
   echo "Type CTRL+C to exit."
done

出力:

スクリプトを実行した後、次の出力が表示されます。出力によると、入力値45と89を入力した後に「Ctrl+C」が押されます。

トップに戻る

ブレークステートメントを使った「for」ループの使用

「break」ステートメントは、特定の条件に基づいてループから終了するためにループ内で使用されます。無限の「for」ループの実行を開始する前に、二つのコマンドライン引数の値がチェックされます。引数の値が空でない場合、ユーザーが四種類の算術演算を実行するかループから終了するかを選択するためのメニューが表示されます。ユーザーが5を押すと、「for」ループ内の最初の「if」条件が真になり、「break」ステートメントが実行されてループから終了します。そうでなければ、入力値に基づいて特定の算術演算が行われます。

#!/bin/bash

#Read two values from the command-line arguments
num1=$1
num2=$2
#Check whether the values are non-empty or not
if [[ ! -z $num1 && ! -z $num2 ]]
then
    for (( ; ; ))
    do
        #Display the menu
        echo "1. ADD"
        echo "2. SUBTRACT"
        echo "3. MULTIPLY"
        echo "4. DIVIDE"
        echo "5. EXIT"
        read -p "Enter your choice: " answer

        #Terminate the loop if 5 is pressed
        if [ $answer -eq 5 ]
        then
             break
        #Add the numbers if 1 is pressed
        elif [ $answer -eq 1 ]
        then
             ((result=$num1+$num2))
        #Subtract the numbers if 2 is pressed
        elif [ $answer -eq 2 ]
        then
             ((result=$num1-$num2))
        #Multiply the numbers if 3 is pressed
        elif [ $answer -eq 3 ]
        then
             ((result=$num1*$num2))
        #Divide the numbers if 4 is pressed
        elif [ $answer -eq 4 ]
        then
             ((result=$num1/$num2))
        fi
        echo "The result is $result."
    done
fi

出力:

次の出力は、引数の値として20と5を指定してスクリプトを実行した後に表示されます。ここで、「1」は最初の入力として取り上げられ、20と5の合計が出力されます。次に、「5」が2つ目の入力として取り上げられ、ループが終了します。

トップに戻る

Continue文を使用した「for」ループの使い方

「continue」ステートメントは、ループ内で特定のステートメントを省略してループの次の繰り返しを続けるために使用されます。以下のスクリプトでは、10回の繰り返しで1から10の間の5で割り切れる数を見つけるために「for」ループが使用されています。「continue」ステートメントは、5で割り切れない数に対して実行されます。

#!/bin/bash

echo "List of numbers divisible by 5 are:"
#Iterate the loop for ten times
for n in {1..10}
do
    #Check whether the number is divisible by 5 or not
    if [ $(($n%5)) -ne 0 ]
    then
        #Continue the loop if the number is divisible not divisible by 5
        continue
    fi
    #Print the numbers which are divisible by 5
    echo "$n is divisible by 5."
done

出力:

スクリプトを実行した後に以下の出力が表示されます。5(5)と10(10)は5で割り切れる数であり、これらは出力に表示されます:

トップに戻る

コマンドライン引数を読むための「for」ループの使用

コマンドライン引数の値を「for」ループを使って読む方法は、以下のスクリプトに示されています。「$@」記号は、「for」ループとともに使われ、コマンドラインの各引数の値を読み取ります。スクリプトでは、引数の値とともに引数番号を印刷するためにカウンタ変数が使用されています。

#!/bin/bash

#Initialize a counter
counter=1;

#Iterate the read argument values
for val in "$@"
do
    #Print each argument value
    echo "Argument $counter: $val";
    #Increment the counter
    ((counter++))
done

出力:

引数の値として12、56、23を指定してスクリプトを実行すると、以下の出力が表示されます:

トップに戻る

連想配列を読み取るための「for」ループの使用

連想配列のキーと値を「for」ループを使用して読み取る方法は、以下のスクリプトに示されています。スクリプト内では、4つの要素からなる連想配列が定義されています。ループの各イテレーションで配列の各キーが解析され、キーの値と対応するキーの値が後で印刷されます。

#!/bin/bash

#Declare an associative array
declare -A marks=( [56345]=90 [34123]=87 [45231]=64 [87234]=70 )

#Iterate the loop to keys of the array
for k in ${!marks[@]}
do
     #Print each key and value of the array
     echo "ID-$k obtained ${marks[$k]} marks."
done

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

「Seq」を使った「For」ループの使用

以下のスクリプトは、“seq”コマンドと“for”ループの使用を示しています。ここでは、“seq”コマンドを使用して7つの連続した日付が生成されます。“date”コマンドは現在の月の値を短縮形式で読み取り、この値を使用して日付を生成します。

#!/bin/bash

#Read the short form of the current month value
month=`date +%b`

#Iterate the loop for 7 times
for i in $(seq 7)
do
    #Generate the date value
    val="$i-$month-2023"
    #Print the date
    echo "Generated date is $val"
done

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

Bashコマンドでの「For」ループの使用

出力のリストを生成するBashコマンドは、「for」ループを使用して解析できます。次のスクリプトは、現在の場所から「t」文字で始まるすべてのテキストファイルのリストを印刷します。

#!/bin/bash

#Read all text files that start with 't'
for val in $(ls t*.txt)
do
    #Print the filename
    echo $val
done

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

ネストされた「for」ループの使用

ネストされた「for」ループを使用して一連の値を生成する方法は、以下のスクリプトに示されています。ここで、外側の「for」ループは3回繰り返され、内側の「for」ループは4回繰り返されます。

#!/bin/bash

#Outer loop
for l1 in {A..C}
do
    #Inner loop
    for l2 in {1..4}
    do
        #Print the merged value
        echo -n "$l1$l2 "
    done
done
#Add newline
echo

出力:

スクリプトを実行した後に次の出力が表示されます:

トップに戻る

ファイルを読むための「While」ループの使用

ファイルの内容を読み取るために「while」ループを使用する方法は、以下のスクリプトに示されています。ここでは、ファイル名がコマンドライン引数として渡され、「while」ループがファイルの内容を行ごとに読み取ります。

#!/bin/bash

#The loop will parse each line of the file
#in each iteration
while read line; do
      #Print each line
      echo $line
#Read the filename from the command-line argument
done < $1

出力:

スクリプトを実行した後に次の出力が表示されます。「temp.txt」の内容が出力に印刷されます。

トップに戻る

複数の条件を使用した「While」ループの使い方

複数の条件を持つ「while」ループの使用方法は、次のスクリプトに示されています。ユーザーから数値が取得され、その値が10より大きく、かつ偶数である場合にループが繰り返しを開始します。各繰り返しで、その値が表示され、2ずつ減少します。

#!/bin/bash

#Take a number from the user
read -p "Enter a number:" num

if [ ! -z $num ]
then
    #Check two conditions for the while loop
    while [ $num -gt 10 ] && [ $(($num%2)) -eq 0 ]
    do
        #Print the number
        echo "$num is even."
        #Decrement the number by 2
        ((num=$num-2))
    done
fi

出力:

入力値16のスクリプトを実行した後、次の出力が表示されます:

トップに戻る

結論

このチュートリアルでは、複数のBashスクリプトを使用してBashループのさまざまな使い方が示されています。これによりBashユーザーはBashループを使用する目的を理解し、自分のスクリプトで適切に使用できるようになります。