諸般の理由でまとめておきたくなったので、備忘録としてまとめておきます。
用語
シェルスクリプト
シェルスクリプトは、コンピュータに対する命令を書いたテキストファイルです。普段コマンドラインで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を開いて移動したスクリプトが想定通りのフォルダにあることを確認します。

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

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

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

=== 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というフォルダが作成されて、内部に処理に必要なファイルが作成されます。
全ての処理を実行してみると以下のようになります。
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
片付け完了
例えばファイル確認の-fで意図的に失敗してみます。
customer_type.txtを生成後に削除します。
root@test-Standard-PC-i440FX-PIIX-1996:/home/test/ドキュメント# ./shell04.sh
=== 遊園地チケット発券システム ===
お客様がやってきました...
Enterキーで受付開始...
【チェック1】チケット売り場はありますか?
✓ ticket_office が見つかりました (-d でディレクトリ確認)
Enterキーで次へ...
【チェック2】お客様情報はありますか?
✗ お客様情報が見つかりません


