シェルスクリプトで行うループ処理(その1)

2016年8月1日(更新: 2018年1月4日)

forループ

同じ処理を繰り返したいときは、for文while文 を使います。このページでは for文 について説明します。

for文

まず、実際にfor文を使った例を示します。次の例では処理を5回繰り返します。

    #!/bin/bash

    for val in 1 2 3 4 5
    do
      echo "${val}回目の処理です"
    done
  

実行結果

1回目の処理です
2回目の処理です
3回目の処理です
4回目の処理です
5回目の処理です

for文の構成は次のようになります。

    #!/bin/bash

    for ループ変数 in 値リスト
    do
      処理
    done
  

for文では、値リストに指定した数値や変数を左から順にループ変数(この例ではval)に代入し、do から done の間の処理でそれを利用できます。ループ変数は呼び出さなくても構いません。ただ5回繰り返したいだけであれば、次のような書き方もできます。

    #!/bin/bash

    for val in 1 1 1 1 1
    do
      echo "繰り返し処理です"
    done
  

実行結果

繰り返し処理です
繰り返し処理です
繰り返し処理です
繰り返し処理です
繰り返し処理です

変数でループ

変数を値リストに設定する場合は次のようになります。

    #!/bin/bash

    abc=10
    def=20
    ghi=50

    for val in ${abc} ${def} ${ghi}
    do
      echo "${val}です"
    done
  

実行結果

10です
20です
50です

値リストに設定した変数の中身が文字列の場合、スペースで区切られてループ変数に代入されます。

    #!/bin/bash

    abc="This is an apple."
    def="That is an orange."
    ghi="1 2 3 4 5"

    for val in ${abc} ${def} ${ghi}
    do
      echo ${val}
    done
  

実行結果

This
is
an
apple.
That
is
an
orange.
1
2
3
4
5

ループ処理の中断

ループ処理を途中で中断させたいときには break という命令文を使います。次の例は、1 から数値を順番に足していき、合計が 20 を超えた段階で処理を中断します。

    #!/bin/bash

    for val in 1 2 3 4 5 6 7 8 9
    do
      sum=$((sum + val))
      echo "現在の合計値は${sum}です"

      if ((sum > 20))
      then
        echo "20を超えたので中断します"
        break #これが実行された時点でループ処理自体が終了する
      fi
    done
  

実行結果

現在の合計値は1です
現在の合計値は3です
現在の合計値は6です
現在の合計値は10です
現在の合計値は15です
現在の合計値は21です
20を超えたので中断します

特定のループ処理をスキップする

continue という命令文を使って、特定のループだけ処理をとばすことができます。次の例では、ループ変数の値が 4 のときに 変数val の値を表示する処理をとばします。

    #!/bin/bash

    for val in 1 2 3 4 5
    do
      if ((val == 4))
      then
        continue #これが実行されると、これより下の文は実行されず、次のループ処理に入る
      fi

      echo ${val}
    done
  

実行結果

0
1
2
3
5

別のfor文の書き方

使用しているシェルが bash であれば、次のような他のプログラミング言語で見られるfor文の形を使うことができます。括弧が二重であることに注意してください。

    #!/bin/bash

    for ((i = 0; i < 10; i++))
    do
        echo ${i}
    done
  

実行結果

0
1
2
3
4
5
6
7
8
9

練習問題

for文を使って、以下の条件を満たすシェルスクリプトを作ってください。

  • シェルスクリプトに実行時引数(数は任意)を渡すと、一つずつ改行して全て表示される。
答え(クリックで開く)
      #!/bin/bash

      for val in ${@}
      do
          echo ${val}
      done
    

コメントを残す

メールアドレスが公開されることはありません。