このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプトのwhile文

シェルスクリプトのwhile文

 while 文は、指定した条件が真である間、繰り返し処理を行うための制御構文です。ループ処理を実現するために頻繁に使用され、条件が満たされなくなるまで特定の処理を繰り返します。

while文の基本構造

while <コマンド>
do
  # 繰り返し処理
done
  • <コマンド>while の後にはコマンドが配置されます。このコマンドの終了ステータスがゼロ(真)である限り、dodone の間に記述された処理が繰り返し実行されます。
  • 多くの場合、if 文と同様に test コマンドや [ ] を用いて条件式を記述します。

例:数値の増加を表示するスクリプト(even.sh

 次に、シェル変数 i の値が 10 以下である限り、「i の値を表示してから 2 を足す」という処理を繰り返すスクリプトを作成します。

スクリプトの作成

user01@ubuntu:~$ nano even.sh

even.sh の内容

#!/bin/bash

i=0

while [ "$i" -le 10 ]
do
  echo "$i"
  i=$((i + 2))
done

解説

  • i=0:変数 i を初期化します。
  • while [ "$i" -le 10 ]i が 10 以下である間、ループを実行します。
  • echo "$i":現在の i の値を表示します。
  • i=$((i + 2))i に 2 を加算します。これは算術式展開を使用しています。

実行権限の付与

user01@ubuntu:~$ chmod +x even.sh

スクリプトの実行

user01@ubuntu:~$ ./even.sh
0
2
4
6
8
10

解説

  • スクリプトは i の値を 0 から開始し、2 ずつ増加させながら 10 以下の間値を表示します。

算術式展開

 bash では、$(( )) を使用することで、内部に記述した数式を評価し、その結果を取得することができます。これを算術式展開と呼びます。

  • 算術式展開内では、シェル変数に $ を付ける必要がありません。
  • 基本的な算術演算(加算、減算、乗算、除算、剰余、累乗)を行うことができます。

算術式展開の例

user01@ubuntu:~$ i=10
user01@ubuntu:~$ echo $((i + 2))   # i に 2 を足す
12
user01@ubuntu:~$ echo $((i - 3))   # i から 3 を引く
7
user01@ubuntu:~$ echo $((i * 2))   # i に 2 を掛ける
20
user01@ubuntu:~$ echo $((i / 2))   # i を 2 で割る
5
user01@ubuntu:~$ echo $((i % 3))   # i を 3 で割った余り
1
user01@ubuntu:~$ echo $((i ** 2))  # i の 2 乗
100

解説

  • 算術式展開を使用することで、外部コマンドを呼び出すことなく効率的に数値計算が可能です。
  • expr コマンドを使う必要がないため、スクリプトの実行速度が向上します。

例:算術式展開を使用したカウントダウンスクリプト(countdown.sh

次に、算術式展開を使用して 5 から 1 までのカウントダウンを行うスクリプトを作成します。

スクリプトの作成

user01@ubuntu:~$ nano countdown.sh

countdown.sh の内容

#!/bin/bash

i=5

while [ "$i" -ge 1 ]
do
  echo "$i"
  i=$((i - 1))
  sleep 1  # 1秒待機
done

echo "カウントダウン終了!"

解説

  • i=5:変数 i を 5 で初期化します。
  • while [ "$i" -ge 1 ]i が 1 以上である間、ループを実行します。
  • echo "$i":現在の i の値を表示します。
  • i=$((i - 1))i から 1 を減算します。
  • sleep 1:1 秒間待機します。
  • ループ終了後に "カウントダウン終了!" を表示します。

実行権限の付与

user01@ubuntu:~$ chmod +x countdown.sh

スクリプトの実行

user01@ubuntu:~$ ./countdown.sh
5
4
3
2
1
カウントダウン終了!

解説

  • スクリプトは 5 から 1 までの数字を 1 秒間隔で表示し、最後にメッセージを表示します。
  • sleep 1 コマンドにより、カウントダウンが 1 秒ごとに進行します。

作成したシェルスクリプトの削除

user01@ubuntu:~$ rm even.sh countdown.sh 

まとめ

  • whileは、指定した条件が真である間、繰り返し処理を行う制御構文です。
  • 算術式展開$(( )))を使用することで、効率的に数値計算を行うことができます。
    ・外部コマンドを使用しないため、スクリプトの実行速度が向上します。
    ・シェル変数を数値として扱う場合に非常に便利です。
  • 実用例として、ループ内で変数の値を増減させる処理が挙げられます。
  • bash スクリプトでは、while 文と算術式展開を組み合わせて、さまざまな繰り返し処理を効率的に実装できます。

これらの知識を活用して、より高度なシェルスクリプトを作成してみてください。