【bash】while文の使い方を解説します/while true doも解説

シェル/bash

bashのwhileループについて調べる人

bashのwhileループについて調べる人
「bashでwhile文を使用した無限ループを実装したいのですが、使い方を忘れてしまいました。正しい方法を知りたいのと、コピペできるソースコード例も欲しいです。」

こんな悩みを解決します。

bashのwhile文は、条件付きの無限ループ処理を行いたい時に用いるフレーズです。ある条件を満たした時だけ、ループを脱します。

余談ですが、10回・100回などあらかじめ定められた有限ループをしたい場合にはfor〜in文を用います。
参考:【bash】for〜inループの使い方を解説

また、外部ファイルから1行ずつ読み込みたい場合には、while read 《変数》文を用います。これについては以下のリンク先で解説していますのでご覧ください。
参考:【bash】while read lineの使い方を解説します

本記事の内容

  • 1.whileによるループ
  • 2.whileループをbreakで抜ける

この記事を書いている私はIT業界歴12年、年収1,000万円ちょっとの金融系エンジニアです。IRIXやSolarisなどのUnixやCygwin、mac、Linuxなど様々な環境でbashによるスクリプティングを行ってきました。

bashは極めて簡単なプログラミング言語ですが、空白の有無などで構文エラーとなること、javaなど一般的なプログラミング言語に慣れている方にとっては直感的ではない構文であることから、忘れてしまうことも多いかと思います。

あと、Qiitaとかに入門者が書いたメモの記事ですと、構文が間違っているケースがあり、少し複雑な文字列の処理ですとエラーとなってしまう書き方も散見されますので、正しい情報を発信したいと思い、記事にしました。

また本記事では、細かい構文に迷ったら、例からコピー&ペーストして使えることも目指しました。少しでもお役に立てますと幸いです。

1.whileによるループ処理

whileによるループ処理

構文は次の通りです。

while 《ループ条件》
do
《繰り返し処理》
done

簡単な例

まずは簡単な例から。文字列変数commandは、whileループ1回目で”bye”が代入され、2回目で追記され”byebye”となり、先頭の条件を満たしてループを抜ける例を示します。

具体例

例:2回whileループした後に先頭の条件を満たし、ループを抜ける

#!/bin/bash
while [ "$command" != "byebye" ]
do
 command="bye$command"    #ループの度に、先頭に文字列"bye"を追記する
 echo $command
done
 

この例では1回目のwhileループで”bye”を出力、2回目のwhileループで”byebye”を出力、3回目の先頭でループを抜けます。

bye
byebye

実践的な例

具体例

例:”bye”と打ち込むまで、打ち込まれた任意のコマンドを実行し続ける

#!/bin/bash
command="pwd"    #初期値として"pwd"をセット
while [ "$command" != "bye" ] #"bye"と入力するまでループし続ける
do
  echo "${command}を実行します"
  $command                    #"pwd"や"cd /tmp"など任意のコマンドを実行する
  read command                #任意のコマンドの入力を受付ける
done
 

この例ではスクリプティング上の制約があります。初期値としてpwdを必ず実行しなくてはなりません。次項でこの制約を改善します。実行結果は以下の通りです。

pwdを実行します
/
cd /tmp
cd /tmpを実行します
pwd
pwdを実行します
/tmp
ls
lsを実行します
file1.txt
uname -n
uname -nを実行します
macbook1
bye

2.【while true do】whileの無限ループをbreakで抜ける

whileループをbreakで抜ける

先ほどの例では、2行目に設定したpwdをループの初回で実行しなくてはなりませんでした。こうせざるを得ないのは、ループの終了条件が冒頭(while [ "$command" != "bye" ])に設定されているためで、本項ではこの点をwhile trueを用いて改修します。

while trueは、無条件でループし続けることを意味します。その代わりに、ループ中に条件を満たした時だけbreakコマンドを実行し、ループを抜けます。

具体例

例:”bye”と打ち込むまで、打ち込まれた任意のコマンドを実行し続ける

#!/bin/bash
while true     #条件のない無限ループ
do
  read command
  [ "$command" == "bye" ] && break     #"bye"と入力した時だけループを抜ける
  echo "${command}を実行します"
  $command
done
 

実行結果は以下の通りです。

cd /tmp
cd /tmpを実行します
pwd
pwdを実行します
/tmp
ls
lsを実行します
file1.txt
uname -n
uname -nを実行します
macbook1
bye

 

今回は以上です。bashでwhileループを使う際の参考になりましたら幸いです。

Blog TOP  シェルスクリプトを勉強したい人向け|bashの使い方 記事まとめ

bashの使い方 - もくじ

bashの使い方 - もくじ

シェルとは

 - シェルとは
 - シェルはOSと会話するための言語
 - シェルの種類(bash以外のシェル)
 - シェルスクリプトとは
 - シェルスクリプトの書き方

条件式

 - if else文
 - 文字列の比較
 - &&と||の使い方
 - case文

文字列操作

 - 文字列の連結
 - 文字列の一部を切り出す

繰り返し

 - for文
 - while文
 - while文でリストから1つ要素ずつ処理する

定数

 - 定数の定義

関数

 - 関数の定義

デバッグ

 - デバッグオプション(-x)

実行権限

 - 実行権限のないシェルスクリプトファイルを実行する

 - シェルスクリプトの書籍3選


今、ITエンジニアは前例のない売り手市場です

ITエンジニアは前例のない売り手市場、転職なら今

現在のエンジニアの求人数と求人倍率をご存知ですか?

直近(※)のIT業界全体の求人倍率は7.85倍です。

つまり 企業が8回 IT人材の求人を出しても、 1人しかエントリーがない 状況です。

エンジニア側が企業を選ぶ なら、今がチャンスです。

※転職サイトdodaが毎月発表している転職求人倍率。
 2019年12月9日発表/集計対象期間は2019年11月1日〜30日

詳しくはこちら


人気記事【今年の抱負】退職しオープン&フリー&シンプルに生きていく【失敗しない働き方改革の本質】