0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bashシェルスクリプト演算子対応表:数値・文字列・ファイル判定の使い分け備忘録

0
Last updated at Posted at 2026-05-02

諸般の理由でまとめておきたくなったので、備忘録としてまとめておきます。

用語

シェルスクリプト

シェルスクリプトは、コンピュータに対する命令を書いたテキストファイルです。普段コマンドラインで1つずつ入力する操作を、まとめて自動実行できます。

「シェルスクリプト」と聞くとすごく難しいもののように聞こえるかもしれませんが「プログラミング」という言葉に置き換えると個人的にはイメージしやすくなると思ってます。「プログラミング」ってイメージをすると黒い画面にわけわからない文字列を並べることで、アプリを作って、そのアプリを使う事で人間側が反復していたものを自動化するものじゃないですか。シェルスクリプトもイメージ的には似ているものだと思います。Linux上ではシェルスクリプトと呼称する、みたいなイメージで良いんじゃないだろうか。。。
(シェルスクリプトの思考方法が理解できるようになると、その思考方法をプログラミングに応用できます。これは逆も然りです。)

もうちょっと違いに突っ込むのであれば以下になるかなと。

  • 一般的なプログラミング(JavaやPythonなど)
    スマホアプリやWebサイトなど、新しい「システムやサービス」を作るのが得意。
  • シェルスクリプト
    Linuxなどの「OS自体の操作(ファイル移動、バックアップ、設定変更など)」を自動化するのが得意。

Windowsでいうところの「バッチファイル(.bat)」のLinux版、と考えるとさらにスッキリするかもしれません。

コマンドライン

マウスを使わずにキーボードの文字入力だけでコンピュータに直接命令を出す画面(黒い画面など)のことです。
Windowsで言うところのPowershellやCMD(コマンドプロンプト)、Teraterm、MacやLinuxでいうTerminal等をイメージしてもらうと良い。

#!/bin/bash

シバン(shebang)というらしい。「このファイルはbashで実行してください」という宣言です。これが無いとシェルスクリプトとして機能しません。
/bin/bashというのはシェルの一種です。

シェル

ターミナルで入力された「ls」や「cd」といった文字を受け取って、「あ、ファイル一覧を表示するんだな」と理解し、コンピュータ(OS)に命令を伝える翻訳機です。シェルスクリプトの1行目に書く #!/bin/bash は、「このテキストファイルに書かれた命令は、bash という翻訳機を使って実行してね!」と指示を出しているものになります。コマンドラインとシェルをイメージに起こすと以下になるでしょうか。

別のアウトプットでご指摘頂いて誤解してる事が判明しました。
以下の記事の図がわかりやすいので解説はこちらに委ねたいと思います

Bash 演算子対応表

数値比較 vs 文字列比較

意味 数値用 文字列用
等しい -eq = または ==
等しくない -ne !=
より大きい -gt > (要エスケープ \>)
以上 -ge -
より小さい -lt < (要エスケープ \<)
以下 -le -
空文字判定 - -z
非空文字判定 - -n

数値比較用で文字列の比較をすることは出来るようなのですが、非推奨の様です。逆も然りです。

比較対象 使うべき演算子 理由
"05" と "5" -eq(数値) 数値として同じと判定したい
"apple" と "banana" =, !=(文字列) 文字列比較
"123abc" =, !=(文字列) 数値演算子だとエラー

論理演算子

意味 演算子
AND -a または &&
OR -o または ||
NOT !

ファイル・ディレクトリ判定

演算子 意味
-f ファイルが存在
-d ディレクトリが存在
-e ファイル/ディレクトリが存在
-r 読み取り可能
-w 書き込み可能
-x 実行可能
-s ファイルサイズが0より大きい

動作確認

Ubuntu24.04のGUI環境を使って何個かスクリプトを用意して試してみたいと思います。

数値比較用演算子

このスクリプトを実行するとユーザに数値の入力を2回求められます。

#!/bin/bash

echo "=== Bash 数値比較 動作検証スクリプト ==="
echo ""

# ユーザー入力
read -p "変数Aの値を入力してください (例: 05): " A
read -p "変数Bの値を入力してください (例: 5): " B

echo ""
echo "入力された値: A='$A', B='$B'"
echo "========================================"

# 数値比較
echo ""
echo "【数値比較】"

if [ "$A" -eq "$B" ]; then
    echo "[-eq] AとBは等しい"
else
    echo "[-eq] AとBは等しくない"
fi

if [ "$A" -ne "$B" ]; then
    echo "[-ne] AとBは等しくない"
else
    echo "[-ne] AとBは等しい"
fi

if [ "$A" -gt "$B" ]; then
    echo "[-gt] AはBより大きい"
else
    echo "[-gt] AはB以下"
fi

if [ "$A" -ge "$B" ]; then
    echo "[-ge] AはB以上"
else
    echo "[-ge] AはBより小さい"
fi

if [ "$A" -lt "$B" ]; then
    echo "[-lt] AはBより小さい"
else
    echo "[-lt] AはB以上"
fi

if [ "$A" -le "$B" ]; then
    echo "[-le] AはB以下"
else
    echo "[-le] AはBより大きい"
fi

echo ""
echo "========================================"
read -p "Enterキーを押すと終了します..." dummy

以下のように準備していきます。

root@test-Standard-PC-i440FX-PIIX-1996:~# nano shell01.sh
root@test-Standard-PC-i440FX-PIIX-1996:~# cat shell01.sh

(上記のスクリプトの内容が表示されていること)

root@test-Standard-PC-i440FX-PIIX-1996:~# chmod 777 shell01.sh 
root@test-Standard-PC-i440FX-PIIX-1996:~# mv shell01.sh /home/test/ドキュメント/

Ubuntuでexplorerを開いて移動したスクリプトが想定通りのフォルダにあることを確認します。
image.png

これを右クリックしてみます。プログラムとして実行を押下します。
image.png

入力を求められます。適当な数値、今回は2を入力してみます。
image.png

もう一つの数値を求められます。こちらでは3を入力してみます。
image.png

人間側から入力された2つの数値を、コードを元に大小比較してその結果が出力されます。
image.png

=== Bash 数値比較 動作検証スクリプト ===

変数Aの値を入力してください (例: 05): 2
変数Bの値を入力してください (例: 5): 3

入力された値: A='2', B='3'
========================================

【数値比較】
[-eq] AとBは等しくない
[-ne] AとBは等しくない
[-gt] AはB以下
[-ge] AはBより小さい
[-lt] AはBより小さい
[-le] AはB以下

========================================
Enterキーを押すと終了します...

これをたとえば5,05の2つで比較すると以下のようになります。

=== Bash 数値比較 動作検証スクリプト ===

変数Aの値を入力してください (例: 05): 5
変数Bの値を入力してください (例: 5): 05

# 入力された値: A='5', B='05'

【数値比較】
[-eq] AとBは等しい
[-ne] AとBは等しい
[-gt] AはB以下
[-ge] AはB以上
[-lt] AはB以上
[-le] AはB以下

========================================
Enterキーを押すと終了します...

数値以外を入力すると怒られます。

=== Bash 数値比較 動作検証スクリプト ===

変数Aの値を入力してください (例: 05): hoge
変数Bの値を入力してください (例: 5): huga

入力された値: A='hoge', B='huga'
========================================

【数値比較】
/home/test/ドキュメント/shell01.sh: 18 行: [: hoge: 整数の式が予期されます
[-eq] AとBは等しくない
/home/test/ドキュメント/shell01.sh: 24 行: [: hoge: 整数の式が予期されます
[-ne] AとBは等しい
/home/test/ドキュメント/shell01.sh: 30 行: [: hoge: 整数の式が予期されます
[-gt] AはB以下
/home/test/ドキュメント/shell01.sh: 36 行: [: hoge: 整数の式が予期されます
[-ge] AはBより小さい
/home/test/ドキュメント/shell01.sh: 42 行: [: hoge: 整数の式が予期されます
[-lt] AはB以上
/home/test/ドキュメント/shell01.sh: 48 行: [: hoge: 整数の式が予期されます
[-le] AはBより大きい

========================================
Enterキーを押すと終了します...

文字列比較用演算子

このスクリプトを実行するとユーザに文字列の入力を2回求められます。

#!/bin/bash

echo "=== Bash 文字列比較 動作検証スクリプト ==="
echo ""

# ユーザー入力
read -p "変数Aの値を入力してください (例: apple): " A
read -p "変数Bの値を入力してください (例: banana): " B

echo ""
echo "入力された値: A='$A', B='$B'"
echo "========================================"

# 文字列比較
echo ""
echo "【文字列比較】"

if [ "$A" = "$B" ]; then
    echo "[=] AとBは等しい"
else
    echo "[=] AとBは等しくない"
fi

if [ "$A" != "$B" ]; then
    echo "[!=] AとBは等しくない"
else
    echo "[!=] AとBは等しい"
fi

if [ "$A" \< "$B" ]; then
    echo "[<] AはBより小さい(辞書順)"
else
    echo "[<] AはB以上(辞書順)"
fi

if [ "$A" \> "$B" ]; then
    echo "[>] AはBより大きい(辞書順)"
else
    echo "[>] AはB以下(辞書順)"
fi

if [ -z "$A" ]; then
    echo "[-z] Aは空文字列"
else
    echo "[-z] Aは空文字列ではない"
fi

if [ -n "$A" ]; then
    echo "[-n] Aは空文字列ではない"
else
    echo "[-n] Aは空文字列"
fi

echo ""
echo "========================================"
read -p "Enterキーを押すと終了します..." dummy

以下のように準備していきます。

root@test-Standard-PC-i440FX-PIIX-1996:~# nano shell02.sh
root@test-Standard-PC-i440FX-PIIX-1996:~# cat shell02.sh

(上記のスクリプトの内容が表示されていること)

root@test-Standard-PC-i440FX-PIIX-1996:~# chmod 777 shell02.sh 
root@test-Standard-PC-i440FX-PIIX-1996:~# mv shell02.sh /home/test/ドキュメント/

実際に実行してみます。
先程はGUIで実行するパターンで試してみたので、今度はCUIで試してみます。
※スクリプトを実行する場合は基本的にはCUIでやることの方が多いと思います。

test@test-Standard-PC-i440FX-PIIX-1996:~/ドキュメント$ ./shell02.sh 
=== Bash 文字列比較 動作検証スクリプト ===

変数Aの値を入力してください (例: apple): apple
変数Bの値を入力してください (例: banana): banana

入力された値: A='apple', B='banana'
========================================

【文字列比較】
[=] AとBは等しくない
[!=] AとBは等しくない
[<] AはBより小さい(辞書順)
[>] AはB以下(辞書順)
[-z] Aは空文字列ではない
[-n] Aは空文字列ではない

========================================
Enterキーを押すと終了します...
test@test-Standard-PC-i440FX-PIIX-1996:~/ドキュメント$ 

※辞書順とは
基本ルールとして、文字コード順で比較(ASCIIコード順)左から1文字ずつ比較する
異なる文字が出たら、その文字コードで大小を判定

数字 < 大文字 < 小文字
0-9 < A-Z < a-z

"Apple" < "Banana"    # A < B
"apple" > "Apple"     # a > A(小文字の方が大きい)
"abc" < "abd"         # c < d
"ab" < "abc"          # 短い方が小さい
"10" < "2"            # 文字として比較すると "1" < "2"
"banana" > "apple"    # b > a

最初に文字列を入力せずに2つ目だけに文字列を入力してみます。

test@test-Standard-PC-i440FX-PIIX-1996:~/ドキュメント$ ./shell02.sh 
=== Bash 文字列比較 動作検証スクリプト ===

変数Aの値を入力してください (例: apple): 
変数Bの値を入力してください (例: banana): hogehoge

入力された値: A='', B='hogehoge'
========================================

【文字列比較】
[=] AとBは等しくない
[!=] AとBは等しくない
[<] AはBより小さい(辞書順)
[>] AはB以下(辞書順)
[-z] Aは空文字列
[-n] Aは空文字列

========================================
Enterキーを押すと終了します...

論理演算子

遊園地の入場チェックというシナリオのコードを用意しました。

#!/bin/bash

echo "=== 遊園地の入場チェックシステム ==="
echo ""
echo "アトラクションに乗れるか判定します"
echo ""

# ユーザー入力
read -p "年齢を入力してください: " age
read -p "身長(cm)を入力してください: " height
read -p "保護者同伴ですか? (yes/no): " guardian

echo ""
echo "========================================"
echo "【入力内容】"
echo "年齢: ${age}歳"
echo "身長: ${height}cm"
echo "保護者同伴: $guardian"
echo "========================================"
echo ""

# AND (&&) の例:両方の条件を満たす必要がある
echo "【ジェットコースター】"
if [ "$age" -ge 12 ] && [ "$height" -ge 140 ]; then
    echo "✓ 乗れます!(12歳以上 AND 140cm以上)"
else
    echo "✗ 乗れません(12歳以上 AND 140cm以上が必要)"
fi

echo ""

# OR (||) の例:どちらかの条件を満たせばOK
echo "【観覧車】"
if [ "$age" -ge 18 ] || [ "$guardian" = "yes" ]; then
    echo "✓ 乗れます!(18歳以上 OR 保護者同伴)"
else
    echo "✗ 乗れません(18歳以上 OR 保護者同伴が必要)"
fi

echo ""

# NOT (!) の例:条件を反転
echo "【キッズエリア】"
if [ ! "$age" -ge 13 ]; then
    echo "✓ 入れます!(13歳未満限定)"
else
    echo "✗ 入れません(13歳未満限定エリアです)"
fi

echo ""

# 複合条件の例
echo "【バイキング】"
if [ "$height" -ge 120 ] && ([ "$age" -ge 10 ] || [ "$guardian" = "yes" ]); then
    echo "✓ 乗れます!(120cm以上 AND (10歳以上 OR 保護者同伴))"
else
    echo "✗ 乗れません"
fi

echo ""
echo "========================================"
read -p "Enterキーを押すと終了します..." dummy

以下のように準備していきます。

root@test-Standard-PC-i440FX-PIIX-1996:~# nano shell03.sh
root@test-Standard-PC-i440FX-PIIX-1996:~# cat shell03.sh

(上記のスクリプトの内容が表示されていること)

root@test-Standard-PC-i440FX-PIIX-1996:~# chmod 777 shell03.sh 
root@test-Standard-PC-i440FX-PIIX-1996:~# mv shell03.sh /home/test/ドキュメント/

これを実行してみます。

root@test-Standard-PC-i440FX-PIIX-1996:/home/test/ドキュメント# ./shell03.sh 
=== 遊園地の入場チェックシステム ===

アトラクションに乗れるか判定します

年齢を入力してください: 15
身長(cm)を入力してください: 170
保護者同伴ですか? (yes/no): no

========================================
【入力内容】
年齢: 15歳
身長: 170cm
保護者同伴: no
========================================

【ジェットコースター】
✓ 乗れます!(12歳以上 AND 140cm以上)

【観覧車】
✗ 乗れません(18歳以上 OR 保護者同伴が必要)

【キッズエリア】
✗ 入れません(13歳未満限定エリアです)

【バイキング】
✓ 乗れます!(120cm以上 AND (10歳以上 OR 保護者同伴))

========================================
Enterキーを押すと終了します...

12歳保護者同伴有で試してみます。

root@test-Standard-PC-i440FX-PIIX-1996:/home/test/ドキュメント# ./shell03.sh 
=== 遊園地の入場チェックシステム ===

アトラクションに乗れるか判定します

年齢を入力してください: 12
身長(cm)を入力してください: 145
保護者同伴ですか? (yes/no): yes

========================================
【入力内容】
年齢: 12歳
身長: 145cm
保護者同伴: yes
========================================

【ジェットコースター】
✓ 乗れます!(12歳以上 AND 140cm以上)

【観覧車】
✓ 乗れます!(18歳以上 OR 保護者同伴)

【キッズエリア】
✓ 入れます!(13歳未満限定)

【バイキング】
✓ 乗れます!(120cm以上 AND (10歳以上 OR 保護者同伴))

========================================
Enterキーを押すと終了します...

ファイル・ディレクトリ判定

遊園地チケット発券システムというシナリオのコードを用意しました。

#!/bin/bash

echo "=== 遊園地チケット発券システム ==="
echo ""

# テストデータ作成
mkdir -p ticket_office 2>/dev/null
echo "adult" > ticket_office/customer_type.txt
echo "" > ticket_office/empty_file.txt
touch ticket_office/vip_pass.txt
chmod 000 ticket_office/vip_pass.txt 2>/dev/null

echo "お客様がやってきました..."
echo ""
read -p "Enterキーで受付開始..." dummy

# チェック1:チケット売り場の確認
echo ""
echo "【チェック1】チケット売り場はありますか?"
if [ -d "ticket_office" ]; then
    echo "  ✓ ticket_office が見つかりました (-d でディレクトリ確認)"
else
    echo "  ✗ チケット売り場が見つかりません"
    exit 1
fi
echo ""
read -p "Enterキーで次へ..." dummy

# チェック2:お客様情報ファイルの確認
echo ""
echo "【チェック2】お客様情報はありますか?"
if [ -f "ticket_office/customer_type.txt" ]; then
    echo "  ✓ customer_type.txt が見つかりました (-f でファイル確認)"
else
    echo "  ✗ お客様情報が見つかりません"
    exit 1
fi
echo ""
read -p "Enterキーで次へ..." dummy

# チェック3:情報が読めるか
echo ""
echo "【チェック3】お客様情報は読めますか?"
if [ -r "ticket_office/customer_type.txt" ]; then
    echo "  ✓ 読み取り可能です (-r で読み取り権限確認)"
    echo "  → お客様タイプ: $(cat ticket_office/customer_type.txt)"
else
    echo "  ✗ 読み取れません"
fi
echo ""
read -p "Enterキーで次へ..." dummy

# チェック4:ファイルに内容があるか
echo ""
echo "【チェック4】空のファイルチェック"
if [ -s "ticket_office/empty_file.txt" ]; then
    echo "  ✓ empty_file.txt には内容があります"
else
    echo "  ✗ empty_file.txt は空です (-s でサイズ確認)"
fi
echo ""
read -p "Enterキーで次へ..." dummy

# チェック5:VIPパスの確認
echo ""
echo "【チェック5】VIPパスは使えますか?"
if [ -e "ticket_office/vip_pass.txt" ]; then
    echo "  ✓ VIPパスは存在します (-e で存在確認)"
    if [ -r "ticket_office/vip_pass.txt" ]; then
        echo "  ✓ VIPパス有効"
    else
        echo "  ✗ VIPパスは無効です(権限なし)"
    fi
fi
echo ""
read -p "Enterキーで次へ..." dummy

echo ""
echo "【発券完了】チケットをどうぞ!"
echo ""
echo "========================================"
echo ""
read -p "片付けますか?(yes/no): " cleanup

if [ "$cleanup" = "yes" ]; then
    chmod 644 ticket_office/vip_pass.txt 2>/dev/null
    rm -rf ticket_office
    echo "片付け完了"
fi

以下のように準備していきます。

root@test-Standard-PC-i440FX-PIIX-1996:~# nano shell04.sh
root@test-Standard-PC-i440FX-PIIX-1996:~# cat shell04.sh

(上記のスクリプトの内容が表示されていること)

root@test-Standard-PC-i440FX-PIIX-1996:~# chmod 777 shell04.sh 
root@test-Standard-PC-i440FX-PIIX-1996:~# mv shell04.sh /home/test/ドキュメント/

実行してみます。

root@test-Standard-PC-i440FX-PIIX-1996:/home/test/ドキュメント# ./shell04.sh 
=== 遊園地チケット発券システム ===

お客様がやってきました...

Enterキーで受付開始...

このタイミングでスクリプトが存在するディレクトリ上にticket_officeというフォルダが作成されて、内部に処理に必要なファイルが作成されます。

image.png

全ての処理を実行してみると以下のようになります。

root@test-Standard-PC-i440FX-PIIX-1996:/home/test/ドキュメント# ./shell04.sh 
=== 遊園地チケット発券システム ===

お客様がやってきました...

Enterキーで受付開始...

【チェック1】チケット売り場はありますか?
  ✓ ticket_office が見つかりました (-d でディレクトリ確認)

Enterキーで次へ...

【チェック2】お客様情報はありますか?
  ✓ customer_type.txt が見つかりました (-f でファイル確認)

Enterキーで次へ...

【チェック3】お客様情報は読めますか?
  ✓ 読み取り可能です (-r で読み取り権限確認)
  → お客様タイプ: adult

Enterキーで次へ...

【チェック4】空のファイルチェック
  ✓ empty_file.txt には内容があります

Enterキーで次へ...

【チェック5】VIPパスは使えますか?
  ✓ VIPパスは存在します (-e で存在確認)
  ✓ VIPパス有効

Enterキーで次へ...

【発券完了】チケットをどうぞ!

========================================

片付けますか?(yes/no): yes
片付け完了

処理終了後にフォルダ/ファイルを削除できます。
image.png

例えばファイル確認の-fで意図的に失敗してみます。
customer_type.txtを生成後に削除します。

root@test-Standard-PC-i440FX-PIIX-1996:/home/test/ドキュメント# ./shell04.sh 
=== 遊園地チケット発券システム ===

お客様がやってきました...

Enterキーで受付開始...

【チェック1】チケット売り場はありますか?
  ✓ ticket_office が見つかりました (-d でディレクトリ確認)

Enterキーで次へ...

【チェック2】お客様情報はありますか?
  ✗ お客様情報が見つかりません
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?