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

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にシェルスクリプトを依頼する際のポイント:

  1. 環境を明確に - OS、シェル、依存コマンド
  2. 入出力を具体的に - 引数、ファイル形式、出力先
  3. エラー処理を指定 - 何が起きたらどうするか
  4. 制約を伝える - 実行環境や注意点

テンプレートを使うことで、AIとのやり取りが減り、一発で期待通りのスクリプトが得られる可能性が高まります。