第8回 条件で処理を分けよう:if・then・else・fiの基本 | はじめてのシェルスクリプト

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第8回 条件で処理を分けよう:if・then・else・fiの基本 | はじめてのシェルスクリプト
目次

はじめに

この連載では、macOS のターミナルで sh を使いながら、シェルスクリプトの基本を順番に学んでいきます。前回(第7回)では、read コマンドを使って、スクリプトの実行中にキーボードからの入力を受け取る方法を学びました。read を使うことで、ユーザーが入力した値を変数に入れ、スクリプトの中で活用できることを確認しましたね。

さて、read で受け取った入力は、そのまま表示したり、別の処理に渡したりすることができました。しかし実際の場面では、「入力された値によって、次に何をするかを変えたい」という場面が出てきます。たとえば、名前が一致したときだけ特定のメッセージを表示したり、答えが yes なら処理を進め、no なら止めたりといった具合です。

第8回では、そのような場面で使う if 文を学びます。if 文を使うと、条件が成り立つかどうかによって実行する処理を分けることができます。thenelsefi の役割を確認しながら、条件によって動きが変わるスクリプトの基本を身につけていきましょう。

この回で学ぶこと

  • if 文とは何か
  • then else fi の役割
  • 条件によって処理が分かれる流れ
  • 文字列比較を使った簡単な条件分岐
  • 入力値や変数と組み合わせる方法
  • 真のときと偽のときの実行結果
  • 初学者がつまずきやすい書き方

if 文とは何か

条件によって処理を分ける

if 文は、条件が成り立つときと成り立たないときで、実行する処理を分けるための構文です。

たとえば、「入力された名前が Taro なら特定のメッセージを表示する」といった処理を書けます。

基本の形

if 文の基本形は次のようになります。

if [ "$name" = "Taro" ]; then
  echo "Matched"
else
  echo "Not matched"
fi

if で条件を書き、条件が成り立つときは then の後ろを実行します。

条件が成り立たないときは else の後ろを実行します。

最後は fi で閉じます。

サンプルコード

if_sample.sh に次の内容を保存します。

#!/bin/sh

echo "Please enter your name:"
read name

if [ "$name" = "Taro" ]; then
  echo "Hello, Taro"
else
  echo "You are not Taro"
fi

実行手順

1. ファイルを作成して保存する

エディタで if_sample.sh という名前のファイルを作成し、次の内容を保存します。

#!/bin/sh

echo "Please enter your name:"
read name

if [ "$name" = "Taro" ]; then
  echo "Hello, Taro"
else
  echo "You are not Taro"
fi

2. Taro と入力して実行する

次のコマンドを実行します。

sh if_sample.sh

まず次のように表示されます。

Please enter your name:

ここで Taro と入力して Enter キーを押します。

実行結果は次のようになります。

Hello, Taro

3. Hanako と入力して実行する

もう一度実行して、今度は Hanako と入力します。

実行結果は次のようになります。

You are not Taro

コードの読み方

read name

この行で、キーボードから入力された値を name に入れています。

[ “$name” = “Taro” ]

この部分で、name に入っている値が Taro と同じかどうかを確認しています。

同じなら条件は真になります。

違えば偽になります。

then

条件が真のときに実行する処理をここから書きます。

else

条件が偽のときに実行する処理をここから書きます。

fi

if 文の終わりを表します。

条件によって結果が変わる

if 文の重要な点は、同じスクリプトでも入力内容によって結果が変わることです。

今回の例では、Taro と入力したときだけ Hello, Taro が表示されます。

それ以外の入力では、You are not Taro が表示されます。

初学者がつまずきやすい点

fi を書き忘れる

if 文は、最後に fi が必要です。

これがないと、構文が正しく終わりません。

= の前後や [ ] の周りの空白を崩す

条件式では、[ "$name" = "Taro" ] のように空白を正しく入れる必要があります。

空白が崩れると、意図した通りに動かないことがあります。

文字列をクォートしない

"$name" のようにクォートを付けておくと、空入力や空白を含む入力でも扱いやすくなります。

よくあるエラー

parse error

fi の書き忘れや、then の位置が正しくない可能性があります。

if then else fi の形をもう一度確認してください。

条件が思った通りに分岐しない

比較している値を確認してください。

[ "$name" = "Taro" ]

では、完全に同じ文字列のときだけ真になります。

入力したのに else 側になる

大文字小文字や空白が違っている可能性があります。

たとえば taroTaro は同じではありません。

練習用コード

次の内容で answer_check.sh を作成して実行してみてください。

#!/bin/sh

echo "Type yes or no:"
read answer

if [ "$answer" = "yes" ]; then
  echo "You typed yes"
else
  echo "You did not type yes"
fi

yes を入力した場合と、no を入力した場合で、表示結果の違いを確認してください。

この回で理解しておくこと

  • if 文は条件によって処理を分けるために使う
  • then は真のとき、else は偽のときの処理を書く
  • fiif 文の終わりを表す
  • [ "$name" = "Taro" ] のように文字列比較ができる
  • 入力値や変数と組み合わせると動的な分岐ができる
  • 条件式の空白やクォートは正確に書く必要がある

まとめ

今回は、if 文を使って条件によって処理を分ける基本を確認しました。

シェルスクリプトでは、入力値や条件に応じて処理を変える場面が多いため、if 文は重要な基本です。

次回は、条件式と test コマンドをもう少し詳しく学びます。

次回予告

次回は「条件式と test コマンドを理解しよう」です。

[ ]test を使って、真と偽をどのように判定するかを確認します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次