ShellScript

シェルのコマンドをまとめて自動実行するスクリプト。作業の自動化に使われる

自動化インフラ
ShellScript」の技術書を見る →

ShellScript とは

シェルスクリプトは、シェル (コマンドを解釈して実行する仕組み) に与える一連のコマンドをファイルにまとめ、自動で順番に実行できるようにしたものだ。Linux や macOS のターミナルで打つコマンドを、そのまま手順書のように記述して再利用できる。日々の繰り返し作業を自動化する、最も手軽な手段の一つになっている。

何に使うか

用途
定型作業ファイルの整理、バックアップ
ビルド・デプロイ一連の手順をまとめて実行
サーバー運用ログ集計、監視、自動処理
環境構築セットアップ手順の自動化

「ターミナルで何度も同じコマンドを打っている」場面は、シェルスクリプトで自動化できるサインだ。

シバンが実行するシェルを決める

スクリプトの 1 行目に置く #!/bin/bash はシバン (shebang) と呼ばれ、コメントではなく OS が読む指定だ。実行権限を与えたファイルを ./script.sh と直接呼ぶと、OS はこの行に書かれたプログラムを起動し、スクリプトのパスを引数として渡す。逆に sh script.sh のようにシェルを明示して呼んだ場合、シバンは単なるコメントとして無視され、指定したシェルが解釈する。手元で bash script.sh と打って確認したスクリプトが、ジョブスケジューラから sh 経由で呼ばれて構文エラーになるのはこの差が原因になりやすい。

書き方意味
#!/bin/bashその絶対パスのシェルを使う。導入場所が違う環境では起動そのものに失敗する
#!/usr/bin/env bashPATH から bash を探して使う。導入場所が環境ごとに違う場合に強い
#!/bin/shその環境で /bin/sh が指すシェルを使う。bash 固有の構文を書いているなら選べない

シバンを書かないと、呼び出した側の環境が決めたシェルで解釈される。手元では動いたのに別のサーバーで落ちるという形で表面化するため、1 行目は省略しない。

終了コードが自動化の生死を分ける

シェルスクリプトは戻り値ではなく終了コード (終了ステータス) で結果を伝える。0 が成功・非ゼロが失敗で、直前のコマンドの値は $? で読める。&& での連結、if の条件判定、CI の成否判定、ジョブスケジューラの失敗通知は、すべてこの数値だけを見ている。

事故が集中するのはここだ。exit を明示しないスクリプトの終了コードは、最後に実行したコマンドのものになる。途中で処理が失敗していても、末尾に進捗表示を置いた時点でスクリプト全体は成功として返る。

#!/bin/bash
false          # 失敗する処理
echo '完了'    # これが最後なので終了コードは 0

上を実際に実行すると $? は 0 になり、呼び出し側から見て「決して失敗しないスクリプト」ができあがる。監視も CI も異常に気づけない。失敗を伝えるなら、判定した時点で exit 1 するか、後片付けを済ませてから元の終了コードで exit する。

読み取り側の決まりも押さえておく。終了コードは 0 から 255 に収まり、exit 256 は 0 として観測される。127 はコマンドが見つからなかったこと、シグナルで終了した場合は 128 に信号番号を足した値になる。SIGTERM (番号 15) で止められたプロセスは 143 を返すため、ジョブが 143 で終わっていればスクリプトのバグではなく外部から停止されたと読める。

強みと位置づけ

シェルスクリプトの強みは、追加のツールをほぼ必要とせず、その場ですぐ書ける手軽さにある。OS のコマンドをそのまま組み合わせられるため、ファイル操作やシステム管理と相性がよい。簡単な自動化なら、専用のプログラミング言語を持ち出すより速い。

限界と注意点

一方、シェルスクリプトは複雑な処理には向かない。条件分岐が入れ子になり、構造化したデータを持ち回り始めたあたりから読みにくさが急に増すため、その段階で Python など本格的な言語へ移すのが定石だ。行数そのものより、分岐とデータ構造の増え方が判断材料になる。

バグの多くは、シェルの展開の順序に由来する。シェルは変数を値に置き換えた後、その結果に対して単語分割とパス名展開を適用する。My File.txt は置き換えの時点では 1 つの値でも、"$f" と引用しなければその後で 2 つの引数に割れる。「空白を含むファイル名で壊れる」という定番の症状は、この順序を知らないまま書くと必ず踏む。

さらに、強力なコマンドを自動実行する以上、ファイルの削除など破壊的な操作は誤れば一瞬で取り返しがつかない。対象の一覧を先に表示して目で確かめてから本番の削除に切り替える手順を挟むだけで、事故の大半は起きなくなる。

この記事は役に立ちましたか?

関連用語

関連する記事