Bash 腳本怎麼寫提示詞(嚴格模式、參數解析、日誌、冪等與 dry-run,可放心放進定時任務)

要寫部署腳本、備份腳本、數據處理腳本,又怕腳本中途出錯還繼續跑、誤刪文件時用:描述腳本要做的事,得到帶嚴格模式、參數校驗、日誌、錯誤處理、預演模式的健壯 Bash 腳本,並附上 ShellCheck 級別的自查。

NNathaniel bigo··原創首發·AI 輔助撰寫
通用大模型 對話模型通用
你是一名寫過大量生產環境 Shell 腳本的運維工程師。請按下面的需求寫一個 Bash 腳本。

- 腳本要做的事(按步驟寫):[腳本功能]
- 運行環境:[運行環境](例:Ubuntu 24.04、CentOS 7、macOS 自帶 bash、容器內)
- 運行方式:[運行方式](可選:手動執行/crontab 定時/CI 流水線)
- 輸入參數:[如目標目錄、保留天數]
- 依賴的外部命令:[如 rsync、jq、aws cli]

腳本要求:
1. 開頭使用嚴格模式(遇錯退出、未定義變量報錯、管道中任一命令失敗即失敗),並說明這些選項各自的作用和需要注意的例外情況(例如允許失敗的命令要顯式處理)。
2. 參數:支持幫助資訊;校驗必填參數和取值;提供預演模式,只打印將要執行的操作、不真正修改任何東西。
3. 安全:
   - 所有變量引用加雙引號;
   - 刪除、覆蓋類操作之前檢查路徑非空且在預期目錄內,絕不出現可能展開成根目錄的刪除命令;
   - 臨時文件用安全的方式創建,並在退出時(包括出錯退出)自動清理;
   - 不在腳本中寫死密碼和密鑰,從環境變量或配置文件讀取。
4. 日誌:帶時間戳輸出到標準錯誤或日誌文件,區分資訊、警告和錯誤;出錯時打印出錯的行號和命令。
5. 冪等:重複執行不會產生副作用(例如已經存在的目錄不報錯、已經處理過的文件跳過)。
6. 定時任務場景:防止上一次還沒跑完、下一次又啟動(加鎖);使用絕對路徑或明確設定 PATH;退出碼有意義。
7. 檢查依賴命令是否存在,不存在時給出明確提示。

輸出:完整腳本(帶中文註釋)、使用示例、可能存在的平台差異(比如 macOS 與 Linux 的 date、sed 參數不同)、建議用 ShellCheck 檢查。

高亮處換成你自己的內容:[腳本功能]、[運行環境]、[運行方式]、[如目標目錄、保留天數]、[如 rsync、jq、aws cli]

ChatGPT Plus 充值

已被複製 0 次

使用說明

怎麼填變量:[運行環境] 很重要:macOS 自帶的 Bash 版本較老,date、sed -i 的用法和 Linux 不同;容器裏的精簡鏡像可能連 bash 都沒有,只有 sh。[運行方式] 是定時任務時,AI 會額外處理加鎖和 PATH 問題。

常見坑:

  • 變量沒加引號,路徑裏有空格就出錯;變量為空時,刪除命令可能刪到完全意想不到的目錄。這是 Shell 腳本最危險的問題。
  • 定時任務裏的環境變量和手動登入時不一樣,腳本里用到的命令找不到。使用絕對路徑或在腳本開頭設定 PATH。
  • 嚴格模式下,grep 沒匹配到內容會返回非零碼導致腳本退出,這類「允許失敗」的命令需要顯式處理。

追問技巧:追問「列出這個腳本在哪些情況下會中途失敗、失敗後系統會處於什麼狀態、重新執行是否安全」。

示例輸出

示例,僅供參考(清理過期備份腳本,節選)
bash
#!/usr/bin/env bash
set -Eeuo pipefail

log() { printf '%s [%s] %s\n' "$(date '+%F %T')" "$1" "$2" >&2; }
trap 'log ERROR "第 ${LINENO} 行出錯:${BASH_COMMAND}"' ERR

BACKUP_DIR="" ; KEEP_DAYS=7 ; DRY_RUN=0
while getopts "d:k:nh" opt; do
  case "$opt" in
    d) BACKUP_DIR="$OPTARG" ;;
    k) KEEP_DAYS="$OPTARG" ;;
    n) DRY_RUN=1 ;;
    h) echo "用法: $0 -d 備份目錄 [-k 保留天數] [-n 預演]"; exit 0 ;;
    *) exit 2 ;;
  esac
done

[[ -n "$BACKUP_DIR" && -d "$BACKUP_DIR" ]] || { log ERROR "備份目錄無效"; exit 2; }
[[ "$BACKUP_DIR" == /data/backups/* ]] || { log ERROR "只允許清理 /data/backups 下的目錄"; exit 2; }

exec 9>/tmp/cleanup-backups.lock
flock -n 9 || { log WARN "上一次任務仍在運行,本次跳過"; exit 0; }

find "$BACKUP_DIR" -name '*.tar.gz' -mtime +"$KEEP_DAYS" -print0 |
while IFS= read -r -d '' f; do
  if (( DRY_RUN )); then log INFO "將刪除 $f"; else rm -f -- "$f"; log INFO "已刪除 $f"; fi
done

同款作品

用這條提示詞做出來的作品;原作者會因此獲得積分

做同款

還沒有同款,來做第一個。

Nathaniel 的更多內容

同主題

同模型

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~