第9回 条件式とtestコマンドを使いこなそう:[ ]と比較演算子の基本 | はじめてのシェルスクリプト

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

System Note $ cat /proc/ai-disclosure

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

第9回 条件式とtestコマンドを使いこなそう:[ ]と比較演算子の基本 | はじめてのシェルスクリプト
目次

はじめに

この連載では、macOS のターミナルで sh を使いながら、シェルスクリプトの基本を順番に学んでいきます。

前回(第8回)では、if 文を使って条件によって処理を分ける方法を学びました。「条件が成り立つとき」と「成り立たないとき」で異なる処理を実行できることが分かりましたね。

しかし、if 文の中に書く [ ] の意味や、どんな条件が書けるのかについては、まだ詳しく見ていませんでした。この [ ] の正体が test コマンドであることを知ると、シェルスクリプトの動きがぐっと明確になります。

第9回では、[ ] と test コマンドの関係を整理しながら、文字列比較・数値比較・ファイルの存在確認といった条件式の基本を学びます。「なぜこの書き方なのか」を理解することで、自信を持って条件分岐を書けるようになりますよ。

この回で学ぶこと

  • [ ] の意味
  • test コマンドとの関係
  • 文字列比較の基本
  • 数値比較の基本
  • ファイルの存在確認
  • 真と偽の判定
  • if 文と組み合わせる方法

[ ] と test コマンド

[ ] は条件を判定する書き方

シェルスクリプトでは、条件を調べるときに [ ] を使います。

たとえば、次のように書きます。

[ "$name" = "Taro" ]

これは、「name の値が Taro と同じか」を判定しています。

test コマンドと同じ考え方

[ ] は、test コマンドとほぼ同じ役割を持っています。

次の2つは同じ考え方です。

test "$name" = "Taro"
[ "$name" = "Taro" ]

初学者向けの例では、[ ] を使う形をよく見かけます。

文字列比較

文字列が同じかどうかを調べるには、= を使います。

[ "$name" = "Taro" ]

同じなら真、違えば偽になります。

数値比較

数値を比較するときは、文字列比較とは別の書き方を使います。

たとえば、53 を比較するなら次のように書きます。

[ "$number" -gt 3 ]

-gt は「より大きい」という意味です。

ファイルの存在確認

ファイルが存在するかどうかを調べることもできます。

[ -f "README.md" ]

この例では、README.md というファイルが存在するかを確認しています。

サンプルコード

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

#!/bin/sh

name="Taro"
number=5

if [ "$name" = "Taro" ]; then
  echo "Name matched"
fi

if [ "$number" -gt 3 ]; then
  echo "Number is greater than 3"
fi

if [ -f "README.md" ]; then
  echo "README.md exists"
fi

実行手順

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

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

#!/bin/sh

name="Taro"
number=5

if [ "$name" = "Taro" ]; then
  echo "Name matched"
fi

if [ "$number" -gt 3 ]; then
  echo "Number is greater than 3"
fi

if [ -f "README.md" ]; then
  echo "README.md exists"
fi

2. スクリプトを実行する

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

sh test_sample.sh

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

Name matched
Number is greater than 3
README.md exists

3. 値を変えて試す

name="Hanako"number=2 に変更して、もう一度実行してみてください。

条件が成り立たなくなると、対応する行は表示されなくなります。

コードの読み方

[ “$name” = “Taro” ]

文字列比較です。

name の値が Taro と同じなら真になります。

[ “$number” -gt 3 ]

数値比較です。

number3 より大きいときに真になります。

[ -f “README.md” ]

ファイル確認です。

指定した名前の通常ファイルが存在するときに真になります。

真と偽の判定

条件式は、結果として真または偽になります。

if 文は、その判定結果を使って処理を分けています。

真なら then の中を実行し、偽なら実行しません。

else がある場合は、偽のときに else 側を実行します。

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

文字列比較と数値比較を混同する

文字列には = を使い、数値には -gt などを使います。

同じ書き方ではありません。

[ ] の前後に空白を入れ忘れる

条件式では、[] の周りにも空白が必要です。

[ "$name" = "Taro" ]

のように書いてください。

ファイル確認の記号を覚えにくい

今回は -f だけを扱います。

まずは「通常ファイルが存在するかを確認する」と覚えれば十分です。

よくあるエラー

[: missing ]

閉じる ] を書き忘れている可能性があります。

[] はセットで書いてください。

条件が思った通りに真にならない

比較している値や記号が合っているか確認してください。

文字列比較なのに数値比較の記号を使っていないか、逆になっていないかを見直します。

ファイル確認が偽になる

今いるディレクトリにそのファイルがあるか確認してください。

pwdls を使って、現在地とファイルの有無を確認すると分かりやすいです。

練習用コード

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

#!/bin/sh

text="apple"
count=10

if [ "$text" = "apple" ]; then
  echo "text matched"
fi

if [ "$count" -gt 5 ]; then
  echo "count is greater than 5"
fi

if [ -f "next_task.txt" ]; then
  echo "next_task.txt exists"
fi

値を変えながら、どの条件が真になるか確認してください。

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

  • [ ] は条件判定のための書き方である
  • test コマンドとほぼ同じ考え方で使える
  • 文字列比較と数値比較では使う記号が異なる
  • -f でファイルの存在確認ができる
  • 条件式は真または偽を返す
  • if 文はその結果を使って処理を分ける

まとめ

今回は、条件式と test コマンドの基本として、文字列比較、数値比較、ファイル確認を学びました。

条件を正しく書けるようになると、if 文を使った分岐をより正確に書けるようになります。

次回は、終了ステータスの考え方を確認します。

次回予告

次回は「終了ステータスを理解しよう」です。

コマンドが成功したか失敗したかを、どのように数値で表しているかを確認します。

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

この記事を書いた人

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

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

Created by UNIX Cafe

目次