【初心者でもすぐわかる】シェルスクリプトwhileの使い方

シェルスクリプトのwhile
  • このエントリーをはてなブックマークに追加
  • Pocket

シェルスクリプトのwhileは「条件が満されているあいだ処理を繰り返す」という「繰り返しの制御文」だ。

if文とおなじくtestコマンドを使用して条件式をたてることが出来る。for文とくらべ複雑な条件式がたてられ、比較的柔軟だ。

このページではwhileについて使い方をご紹介する。シェルスクリプトを書くのであれば覚えておこう。

 

一般的な書式について

while [ 条件式  ]
do
  処理…
done

実際のところtestコマンドを使用しなかった場合でも、値の結果が「真」になれば繰り返し処理をしてくれるので、コマンド結果を条件として扱うことも可能だ。例は後半に後述する。

whileのサンプルコード

実際にwhileでの動きを見てみよう。

サンプルコード

vi while-ex1.sh

実行結果

$ ./while-ex1.sh

while

letについて

整数を使った演算を処理するコマンドだ。四則演算にくわえインクリメント処理(1ずつ増やす)、ディクリメント処理(1ずつ減らす)などが可能になっている。

例えば

$ let var=10+10; echo $var

$ var=10; let  var++; echo $var

となる。

もう少し実践的に

無限ループとBreak

whileは意図的に無限ループをおこないたいときにも使われる。無限ループとは永遠にwhileの外に抜け出すことができず、処理を繰り返すことだ。

しかし基本的に中でif文などの条件分岐を使い抜けだす条件を作るのが一般的だ。このとき抜けだす為の条件式に気をつけよう。抜けだす為の条件式をあやまると無限ループから抜けだせなくなる。

「while :」や「while true」や「while [ 1 ]」とすると無限ループが発生する。

サンプルコード

vi while-ex2.sh

実行結果

$ ./while-ex2.sh

while ループ

抜けだせなくなる初歩的な例

vi while-bad-ex1.sh

通常この様な書き方はしないが、一例としてとらえてほしい。

なにかしらの無限ループをする場合条件分岐で「break」への糸口をつくるが、その条件分岐を間違えると抜けだせなくなる。

コンピュータプログラムは基本的に「記述規則のエラー」は検出できるが、処理内容が「意図的かどうか?」は判別しないのである。良くも悪くも愚直なのだ。

無限ループが止まらなくなったら

意図しない無限ループが発生した場合は「Control + c」を連打すると止められる。

条件式にはtest以外も設定可能

条件式にはtest以外を設定することもできる。典型的な実用例としては下記のようなものがある。

サンプルコード

vi while-ex3.sh

実行結果

$ cat testfile.txt

$ ./while-ex3.sh

test以外のケース

continue文について

whileなどの文の先頭に戻る。結果continue文を実行した場合、後ろに書いてある文は実行されない。

vi while-ex4.sh

実行結果

$ ./while-ex4.sh

continue

その他:似たり寄ったりなコマンド

時代とともに変化しつづけてきたLinuxはことによりけり「似たり寄ったりな結果になるコマンド」が存在することがある。

今回のスクリプトの例でletコマンドを使いCOUNTERの値を増やしたがexprでも同じことが可能だ、もしくはbcなどのコマンドを使用しても問題ないだろう。

どれを使うか迷うかもしれないが、基本的な方針としては可読性の高いものを選択するというのも一つの基準だ。しかし、なにかしらのこだわりなどがある場合など、最終的にユーザの判断にゆだねられる。

LinuxやUnixというのは方法、選択肢を多く提供してくれるシステムだ。最初は選択肢の多さにとまどうかもしれないが「状況が使うべきコマンドを選ぶ」ことも多い、ケースバイケースで使っていこう。

まとめ

このページではシェルスクリプトのwhileについてまとめてご紹介した。

forももちろん使うが、whileも活躍する場面が多いため、ぜひ理解して使いこなせるようになっておこう。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できます。

IT講師に興味はありませんか?

・「今までIT講師をやってきたが、更に多くの講義を行いたい」

・「エンジニアとしてやってきたが講師業に魅力を感じている」

・「講師として活躍するためにベースとなる知識を知りたい」

・「様々な分野や言語の講師にチャレンジしてみたい」


という方はぜひIT講師募集のページをご覧ください。


リナックスアカデミーでは「受講している方々にITを好きになってもらう」ことを目標に、同じ目標に向かって歩んで行ける講師の方を常に探しています。


システム開発やインフラ構築などのエンジニアリング経験を活かし、新入社員などの未経験者や経験の浅い初学者の方々に対してITトレーニングを行っていただくことになります。


テキストやカリキュラムは事前に用意されており、それらを元に講義を進めていくため、IT講師をはじめて実施する方でも安心してトレーニングを実施できます。


IT講師募集のページを見る

SNSでもご購読できます。

コメント

  1. 健太郎 より:

    ×永遠と
    ○永遠にor延々と

    1. リナックスアカデミー より:

      ご指摘いただきありがとうございます。
      一部文章におかしな部分がありましたので訂正いたしました。

      引き続き、ご愛読のほど、よろしくお願いいたします。

  2. Hide より:

    while文のサンプルコードの1番最初の、read -p の直後にダブルコーティションが抜けているのでエラーに。

    read -p 何回繰り返しますか?: TMP_NUM

    read -p "何回繰り返しますか?:" TMP_NUM

    が正確なコードになるかと思われます。

    1. Hide より:

      と思いましたが、1文なので問題なしですね。。
      英文で質問文を作成したので、2語以上になるため""が必要となりエラーでした。
      失礼しました。。。

      こちらのread -p のサンプル4ですと、1文でも""を付けて頂いているので、統一したほうが親切かもしれませんね。

      https://eng-entrance.com/linux-shellscript-keyboard

    2. リナックスアカデミー より:

      いつもご愛読いただきありがとうございます。

      ご指摘頂きました通り、readコマンドの構文としては一文で済む場合にはダブルクオートで括らなくても動作しますが、間にスペースなどを挟んだ場合にはダブルクオートが必須となります。サンプルプログラム内においては不要な実行エラーを防ぐ意味でも一律で括る方が宜しいかと思います。該当記事につきましては修正させて頂きました。

      今後とも、ご愛読のほどよろしくお願いいたします。

コメントを残す

*

未経験からの育成制度も充実
IT講師に興味はありませんか?

リナックスアカデミーでIT講師の積極募集を開始! 経験・未経験問わずご応募可能。育成制度で講師スキル向上も目指せます

IT講師に応募する