午前2時の電話と高くついた教訓
午前2時、机の上で電話が激しく震えます。ぼんやりと画面を開くと、目に飛び込んできたのは数千行のエラーログ。本番サーバーのリソースが枯渇しています。原因はサイバー攻撃ではなく、定期的なcronジョブで実行されていたBashスクリプトでした。スペースを含むパス変数に二重引用符を付け忘れただけで、rm -rfコマンドは一時ディレクトリをクリーンアップする代わりに、周囲の重要なデータを一掃してしまったのです。
このようなシナリオは決して珍しくありません。5年以上のシステム管理経験を経て、どんなに注意を払っていても、タイポや論理的なミスは常に潜んでいることに気づきました。徹夜でバグ修正をしないために、私はいつも強力な助っ人を使っています。それがShellCheckです。
ShellCheckは単なる構文チェックツールではありません。まるでベテランの同僚が一行ずつコードを精査し、セキュリティ上の脆弱性や古いコマンドを、実害が出る前に指摘してくれるようなものです。
クイックスタート:60秒でShellCheckをインストール
この「盾」を備えるのは非常に簡単です。お使いのOSに合わせて、対応するコマンドを実行してください。
1. Linuxへのインストール
Ubuntu/Debian:
sudo apt update && sudo apt install shellcheck
CentOS/RHEL (EPEL経由):
sudo yum install epel-release -y
sudo yum install shellcheck -y
MacOS (Homebrew使用):
brew install shellcheck
2. 最初のスクリプトをチェックする
例えば、よくある間違いを含んだ clean_logs.sh というスクリプトがあるとします:
#!/bin/bash
log_dir=/var/log/my app
rm -rf $log_dir/*
shellcheck clean_logs.shを実行すると、すぐに赤い警告が表示されます。Bashでは、二重引用符がない場合、上記のコマンドは rm -rf /var/log/my app/* と解釈されます。シェルはこれを /var/log/my ディレクトリと app/ 内のすべてのファイルという2つの別々の引数として理解します。そこから惨劇が始まります。
誰もが陥りやすい3つの「致命的」なミス
ShellCheckは、数百行に及ぶスクリプトファイルの中で、肉眼では見つけるのが難しい論理エラーを特定するのに役立ちます。
1. 変数のクォート忘れ (Quoting)
これは「ミスの中の王様」です。スペースや特殊文字からスクリプトを守るために、変数は常に二重引用符で囲みましょう。
# 高いリスク
file_path=$1
# プロフェッショナルの標準
file_path="$1"
2. 「幽霊」変数 (未割り当ての変数)
変数名を打ち間違えましたか?Bashはデフォルトで、エラーを出す代わりにそれを空文字列として扱います。ShellCheckはすぐに警告してくれます:var is referenced but not assigned。
target_dir="/tmp/data"
rm -rf "$targte_dir/" # 変数名の打ち間違い、危うくルート / を一掃するところ
3. バッククォート (“) の多用
`command` を使うのは90年代のスタイルです。ネスト(入れ子)が非常に難しく、特殊文字の処理も困難です。ShellCheckは、よりモダンでクリーンな $(command) への移行を促してくれます。
ワークフローにShellCheckを取り入れて作業を楽にする
書き終わるまで待ってからチェックするのではなく、自動化しましょう。
VS Codeへの直接統合
拡張機能の「shellcheck」を探してインストールしてください。タイポやミスをするたびに赤い下線が表示され、詳細な修正ガイドが添えられます。まるでLinuxの専門家がすぐそばで「ヒント」をくれているようなものです。
CI/CDによる自動化
大規模なプロジェクトでは、GitHub ActionsやGitLab CIのパイプラインにShellCheckを追加しましょう。ShellCheckのテストに合格したスクリプトのみがマージを許可されます。これにより、リポジトリ内のBashコードが100%標準に準拠していることが保証されます。
# GitHub Actionsのサンプル
steps:
- uses: actions/checkout@v3
- name: Run ShellCheck
run: shellcheck scripts/*.sh
実践的なアドバイス:ShellCheckだけで終わらせない
スクリプトを本番環境で真に堅牢なものにするために、私はすべてのスクリプトの2行目に set -euo pipefail を常に記述しています。このコマンドは、エラーが発生した瞬間にスクリプトを停止させ、実行を継続してさらなる被害を出すのを防ぎます。
また、改行コード(Line Endings)にも注意してください。Windows (CRLF) で作成して Linux (LF) にアップロードすると、スクリプトが奇妙なエラーを出すことがあります。ShellCheckはこの問題にも敏感で、すぐにフォーマットの変換を促してくれます。
Bashを書くことは難しくありませんが、安全に書くことが難しいのです。今すぐShellCheckをインストールしましょう。不注意なスペース一つのために、サーバーがダウンしてから後悔することのないように!
最後に、スクリプトを本番環境で真に堅牢なものにするために、サーバーのパフォーマンス監視やリソースの最適化も忘れずに行いましょう。

