AIにシェルスクリプトを作ってもらうときのプロンプトテンプレート

目次
注意事項
- 本記事の内容は試験的な実装であり、アイデアベースの検証です
- 実務での利用を保証するものではありません
- 実装についての責任は負いかねます。自己責任でご利用ください
- AIの出力結果は常に検証が必要です
はじめに
AIにシェルスクリプトを作ってもらう際、曖昧な依頼だと期待通りの結果が得られないことがあります。
この記事では、精度の高いスクリプトを得るためのプロンプトテンプレートを紹介します。
基本テンプレート
以下の要件でシェルスクリプトを作成してください。
## 目的
[何をしたいか]
## 環境
- OS: [macOS / Ubuntu / CentOS など]
- シェル: [bash / zsh / sh]
- 必要なコマンド: [特定のコマンドがあれば]
## 入力
- [入力ファイル、引数、環境変数など]
## 出力
- [期待する出力、ファイル、標準出力など]
## 処理の流れ
1. [ステップ1]
2. [ステップ2]
3. [ステップ3]
## エラー処理
- [エラー時の挙動]
## 制約・注意点
- [あれば記載]
使用例
例1: バックアップスクリプト
以下の要件でシェルスクリプトを作成してください。
## 目的
指定ディレクトリを日付付きでtar.gzにバックアップする
## 環境
- OS: macOS
- シェル: zsh
## 入力
- 第1引数: バックアップ対象ディレクトリ
- 第2引数: バックアップ先ディレクトリ(省略時は~/backup)
## 出力
- backup_YYYYMMDD_HHMMSS.tar.gz 形式のファイル
## 処理の流れ
1. 引数チェック
2. バックアップ先ディレクトリがなければ作成
3. tar.gzで圧縮
4. 完了メッセージを表示
## エラー処理
- 対象ディレクトリが存在しない場合はエラー終了
- 圧縮に失敗した場合はエラー終了
## 制約・注意点
- 7日以上前のバックアップは自動削除
例2: ログ監視スクリプト
以下の要件でシェルスクリプトを作成してください。
## 目的
ログファイルを監視し、特定のキーワードが出現したらSlackに通知する
## 環境
- OS: Ubuntu 22.04
- シェル: bash
## 入力
- 環境変数 SLACK_WEBHOOK_URL: Slack Webhook URL
- 環境変数 LOG_FILE: 監視対象のログファイルパス
- 環境変数 KEYWORDS: 検知するキーワード(カンマ区切り)
## 出力
- Slackへの通知
- 標準出力にログ
## 処理の流れ
1. 環境変数のチェック
2. tail -f でログを監視
3. キーワードにマッチしたらSlackに通知
4. 通知内容をログに出力
## エラー処理
- 環境変数が未設定の場合はエラー終了
- ログファイルが存在しない場合はエラー終了
- Slack通知に失敗した場合はリトライ(3回まで)
## 制約・注意点
- 同じ内容の通知は5分間抑制する
- systemdで動かすことを想定
プロンプトのポイント
1. 環境を明確にする
| 項目 | 理由 |
|---|---|
| OS | コマンドの違い(macOS vs Linux) |
| シェル | 構文の違い(bash vs zsh vs sh) |
| 依存コマンド | インストール要否の判断 |
2. 入出力を具体的に
# 悪い例
ファイルを処理する
# 良い例
- 入力: CSVファイル(カンマ区切り、ヘッダーあり)
- 出力: JSON形式で標準出力
3. エラー処理を指定する
# 悪い例
エラーがあったら止める
# 良い例
- ファイルが存在しない場合: 終了コード1でexit、エラーメッセージを標準エラー出力
- API呼び出し失敗: 3回リトライ後、失敗なら終了コード2でexit
4. 追加の要望
必要に応じて以下も伝えると良いでしょう。
| 項目 | 例 |
|---|---|
| ログ出力 | 「処理の進捗をログに出力」 |
| ドライラン | 「-n オプションで実行せずに確認」 |
| 設定ファイル | 「設定は config.sh から読み込む」 |
| 並列処理 | 「xargsで並列実行」 |
| 冪等性 | 「何度実行しても同じ結果」 |
アンチパターン集
よくある失敗例を紹介します。
1. 曖昧な目的
# NG
ファイルを整理するスクリプトを作って
# OK
指定ディレクトリ内の画像ファイル(jpg, png, gif)を
撮影日ごとのサブディレクトリに移動するスクリプトを作って
- 撮影日はEXIF情報から取得
- EXIF情報がない場合はファイルの更新日を使用
2. 環境の省略
# NG
dateコマンドで日付を取得して
# OK
macOSのdateコマンドで日付を取得して
(※macOSとLinuxでdateのオプションが異なるため)
3. 入力形式が不明
# NG
CSVを読み込んで処理
# OK
CSVファイルを読み込んで処理
- 区切り文字: カンマ
- 文字コード: UTF-8
- 1行目: ヘッダー行(name, email, age)
- クォート: ダブルクォート(フィールド内にカンマを含む場合あり)
4. エラー処理が曖昧
# NG
エラーが起きたら適切に処理して
# OK
- ファイルが見つからない場合: エラーメッセージを出力して終了コード1
- ディスク容量不足の場合: 警告を出力して処理をスキップ
- ネットワークエラーの場合: 30秒待って3回リトライ、失敗なら終了コード2
5. 出力先が不明
# NG
結果を出力して
# OK
- 処理結果: JSON形式で標準出力
- 進捗ログ: 標準エラー出力
- エラー詳細: /var/log/script.log に追記
6. 実行頻度・タイミングの省略
# NG
古いファイルを削除して
# OK
30日以上前のログファイルを削除して
- cronで毎日深夜3時に実行
- 削除前に対象ファイル一覧をログ出力
- 削除件数をサマリーとして出力
7. 特殊文字の考慮漏れ
# NG
ファイル名を処理して
# OK
ファイル名を処理して
- スペースを含むファイル名に対応
- 日本語ファイル名に対応
- 改行を含むファイル名は除外
8. 権限の考慮漏れ
# NG
設定ファイルを更新して
# OK
設定ファイルを更新して
- 実行ユーザー: 一般ユーザー(sudo不可)
- 対象ファイル: ~/.config/app/config.json
- バックアップ: 更新前に .bak を作成
9. 依存コマンドの省略
# NG
JSONをパースして
# OK
JSONをパースして
- jqコマンドを使用(インストール済み)
- または、jqがない環境向けにpythonを使用
10. 既存処理との整合性
# NG
デプロイスクリプトを作って
# OK
デプロイスクリプトを作って
- 既存のCI/CDパイプライン(GitHub Actions)から呼び出す
- 環境変数 DEPLOY_ENV で本番/ステージングを切り替え
- 既存の rollback.sh と同じディレクトリ構成を使用
11. 並列処理の考慮漏れ
# NG
大量のファイルを変換して
# OK
大量のファイル(約10,000件)を変換して
- xargsで4並列処理
- 処理済みファイル数を100件ごとに進捗表示
- 途中で中断した場合は未処理分から再開可能に
12. セキュリティの考慮漏れ
# NG
APIを呼び出すスクリプトを作って
# OK
APIを呼び出すスクリプトを作って
- APIキーは環境変数 API_KEY から取得(スクリプトに直書きしない)
- 一時ファイルは /tmp ではなく mktemp で作成
- 処理完了後は一時ファイルを確実に削除(trapを使用)
13. ログ・デバッグの考慮漏れ
# NG
バッチ処理を作って
# OK
バッチ処理を作って
- 開始・終了時刻をログ出力
- 処理件数をサマリー出力
- -v オプションで詳細ログ(デバッグ用)
- ログは日付ごとにローテーション
簡易テンプレート
シンプルなスクリプトの場合は、以下の短縮版でも十分です。
[目的]をするbashスクリプトを作成してください。
- 入力: [入力]
- 出力: [出力]
- エラー時は終了コード1で終了
- macOS/Linuxの両方で動くように
AIに追加で依頼すると便利なこと
| 依頼 | 効果 |
|---|---|
| 「コメントを付けて」 | 可読性向上 |
| 「使用例を教えて」 | 使い方がわかる |
| 「set -euo pipefail を入れて」 | エラー時に即座に停止 |
| 「変数名は大文字で」 | 一般的な慣習に従う |
| 「ShellCheckでエラーが出ないように」 | 品質向上 |
まとめ
AIにシェルスクリプトを依頼する際のポイント:
- 環境を明確に - OS、シェル、依存コマンド
- 入出力を具体的に - 引数、ファイル形式、出力先
- エラー処理を指定 - 何が起きたらどうするか
- 制約を伝える - 実行環境や注意点
テンプレートを使うことで、AIとのやり取りが減り、一発で期待通りのスクリプトが得られる可能性が高まります。