シェルスクリプトの繰り返し処理

シェルスクリプトの繰り返し処理の方法とはまりやすいエラーの対処法を紹介します。

for文

繰り返し処理をする回数が明白である、または規則的に増加または減少する変数を使うときfor文を用います。

シェルスクリプトでは以下のように記述します。

for 変数 in リスト
do
    処理
done

リストの値を一つずつ変数varに代入し、処理をします。

varsの最後の要素をvarに代入したら繰り返し処理を終了します。

bashなら、以下のようにC言語に似たような構文で繰り返し処理を実行することができます。

for (( 開始条件;終了条件;間隔)){
    処理
}

具体例

for i in 0 1 2 3 4 5 6 7 8 9
do
   echo $i
done
for(( i=0;i<10;i++)){
    echo $i
}

こちら上記2つの例は同じで、0から9まで1つずつ増加させながら変数iに代入し、出力を行います。

for文応用

リストを*にするとカレントディレクトリのファイル名が入ります。

カレントディレクトリは以下の通りです。

$ ls
sample_00.txt  sample_01.txt  sample_02.txt

sample.sh

#!/bin/bash

for i in *
do
    echo $i
done

実行

$ bash sample.sh
sample_00.txt
sample_01.txt
sample_02.txt

while文

繰り返し処理をする回数が決まっていない、ある条件の下で繰り返し処理をしたいときに用います。

while [ 条件式 ]
do
    処理
done

条件式のもとで繰り返し処理を実行します。

したがって、for文のように回数が決まっている、規則的に変化する変数を用いる場合でも使用できます。

よくあるエラーとして以下が挙げられます。

sample.sh

#!/bin/bash

i=0
while [ $i -lt 10]
do
    echo $i
    i=$((i+1))
done

実行

sample.sh: line 5: while[ 0 -lt 10 ]: command not found
sample.sh: line 6: syntax error near unexpected token `do'
sample.sh: line 6: `do'

whileと[の間にスペースがないと上記のエラーメッセージが出ます。

sample.sh: line 5: [0: command not found
[と条件式の間にスペースがないと上記のエラーメッセージが出ます。

sample.sh: line 5: [: missing `]'

条件式と]の間にスペースがないと上記のエラーメッセージが出ます。

要は、whileと[の間、[と条件式の間、条件式と]の間にはスペースが必要です。

while文でtestコマンド

while test 条件式
do
    処理
done

この場合、上記で紹介したエラーメッセージは出ません。

まとめ

シェルスクリプトではfor文とwhile文で繰り返し処理をします。