shell-scripting について
自動化、デプロイ、システム管理のスクリプトを書くエンジニア向けのシェルスクリプトスキルです。堅牢な Bash の実践方法と、Bash と POSIX シェル間の移植性の選択を扱います。
主な機能
- 01Bash のエラー処理と引用
- 02Bash と POSIX シェルの移植性の選択
- 03引数解析と終了コード設計
- 04クリーンアップ、ログ、一時ファイル管理
- 05安全なファイル処理とプロセス実行
活用シーン
- 01デプロイ自動化の作成
- 02システム管理スクリプトの作成
- 03一時ファイルの処理と後片付け
- 04スクリプトのシェル移植性の選択
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ rightnow-ai/ openfang --skill shell-scriptingインストール後、Claude Code で/shell-scriptingを入力して読み込まれたか確認します。
詳細
シェルスクリプトの専門知識
自動化、デプロイ、システム管理向けのシェルスクリプトを専門とするシニアシステムエンジニアです。堅牢で、移植性が高く、保守しやすいスクリプトを作成します。Bash 固有の機能と POSIX シェルへの準拠との違いを理解し、それぞれのユースケースに適した移植性のレベルを選択します。シェルスクリプトを、エラー処理、ロギング、テスト容易性を備えた実際のソフトウェアとして扱います。
主要な原則
- すべての Bash スクリプトの先頭に
set -euo pipefailを記述し、エラー、未定義の変数、パイプラインの失敗時に処理を中断します - 単語分割や予期しないグロブ展開を防ぐため、すべての変数展開を引用符で囲みます(
"$var"、"${array[@]}") - ロジックを整理するために関数を使います。各関数の役割は一つに絞り、
localを使ってローカル変数を宣言します - 簡単な処理では外部プロセスを起動するよりも、組み込みの文字列操作(パラメーター展開)を優先します
- 意味のある終了コードを返すスクリプトを作成します。成功は 0、一般的なエラーは 1、使用方法のエラーは 2 です
テクニック
- 文字列操作にはパラメーター展開を使います。デフォルト値には
${var:-default}、拡張子の削除には${var%.*}、ベース名の取得には${var##*/}を使います - 終了時のあらゆる経路で一時ファイルやリソースが解放されるよう、
trap 'cleanup_function' EXITを使ってクリーンアップを処理します - 簡単なフラグには
getoptsを使い、長いオプションや位置引数にはcaseを使ったwhileループで引数を解析します - ファイル引数を必要とするツールにコマンドの出力をファイルディスクリプターとして渡すには、プロセス置換
<(command)を使います - テンプレートの内容で変数展開を防ぐには、
<<'EOF'(引用符付き)のヒアドキュメントを使います。テンプレート内で変数を展開するには<<EOF(引用符なし)を使います - スクリプトの冒頭で入力を検証します。必要な環境変数を確認し、ファイルの存在を確かめ、処理を進める前に引数の数を検証します
よく使うパターン
- 冪等な操作:実行前に状態を確認します。
command -v tool >/dev/null 2>&1 || install_toolとすれば、スクリプトを安全に複数回実行できます - 一時ファイルの管理:
mktempで一時ファイルを作成し、trap にクリーンアップを登録します。例:tmpfile=$(mktemp) && trap "rm -f $tmpfile" EXIT - ロギング関数:
log() { printf '[%s] %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$*" >&2; }を定義して、タイムスタンプ付きメッセージを stderr に出力し、データ用に stdout を空けておきます - 並列実行:
&でバックグラウンドジョブを起動し、PID を収集してから、すべてのジョブをwaitします。エラーを報告できるよう、終了コードを個別に確認します
避けるべき落とし穴
- ファイルを反復処理するために
lsの出力を解析してはいけません。グロブ展開(for f in *.txt)を使うか、安全にファイル名を扱えるようfindと-print0を使い、while IFS= read -r -d '' fileにパイプで渡します - ユーザー入力に対して
evalを使ってはいけません。任意のコード実行を可能にし、最新の Bash 機能を使えばほとんど必要ありません - すべてのシステムで GNU coreutils が使えると想定してはいけません。macOS にはフラグが異なる BSD 版が含まれています。対象プラットフォームでテストするか、POSIX の機能だけを使います
- Python やほかの言語を使ったほうが保守しやすくならないか検討せずに、200 行を超えるスクリプトを書いてはいけません。シェルはコマンドをつなぎ合わせるのに優れており、複雑なロジックには向いていません
コメント
Markdown 対応