首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Shell 腳本實現無限迴圈的三種寫法與最佳實踐

     編輯:關於C語言

核心語法:: 空命令

在 Shell 中,:(冒號)是一個內建空命令,永遠回傳成功(exit code 0),相當於 C 語言的空語句 ;。利用此特性可構建最簡潔的無限迴圈:

#!/bin/sh
while :
do
    # 執行任務
    echo "Running... $(date)"
    sleep 1
done

三種主流寫法對比

寫法範例可移植性推薦場景
while :while :; do ...; done✅ POSIX 標準,所有 sh 相容嵌入式、最小化腳本、跨平台
while truewhile 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved