: 空命令在 Shell 中,:(冒號)是一個內建空命令,永遠回傳成功(exit code 0),相當於 C 語言的空語句 ;。利用此特性可構建最簡潔的無限迴圈:
#!/bin/sh
while :
do
# 執行任務
echo "Running... $(date)"
sleep 1
done
| 寫法 | 範例 | 可移植性 | 推薦場景 |
|---|---|---|---|
while : | while :; do ...; done | ✅ POSIX 標準,所有 sh 相容 | 嵌入式、最小化腳本、跨平台 |
while true | while true; do ...; done | ✅ Bash/zsh/ksh 等主流 Shell | 現代 Linux 環境,可讀性最佳 |
for (( ; ; )) | for (( ; ; )); do ...; done | ⚠️ 僅 Bash/ksh/zsh 支援 | 需用到 C 風格計數器的複雜邏輯 |
#!/bin/bash
# 生產級無限迴圈範本
cleanup() {
echo "收到終止訊號,正在清理..."
# 清理臨時檔、關閉連線等
exit 0
}
# 捕捉常見終止訊號
trap cleanup SIGINT SIGTERM
echo "服務啟動,PID: $$"
while true; do
# 核心業務邏輯
if ! do_work; then
echo "任務失敗,重試中..." >&2
fi
# 可配置間隔,避免佔滿 CPU
sleep "${INTERVAL:-5}"
done
sleep → 佔用 100% CPU,系統卡頓kill 無法優雅停止,殘留資源wait → 產生殭屍程序select 實現定時輪詢(避免 drift)# 精確每 10 秒執行一次,不累積誤差
while :; do
start=$(date +%s)
do_work
elapsed=$(( $(date +%s) - start ))
sleep $(( 10 - elapsed ))
done