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

Shell 參數解析三種方案深度對比:手寫 case、getopt 與 getopts

     編輯:更多程式設計知識

測試場景

腳本調用:script -a -b dog -c "earth moon" -d -f param1 param2

方案一:手寫 while + case(完全可控)


nomal_opts_act() {
    while [ -n "$1" ]; do
        case "$1" in
            -a) echo "Found -a" ;;
            -b) echo "Found -b, param: $2"; shift ;;
            -c) echo "Found -c, param: $2"; shift ;;
            -d) echo "Found -d" ;;
            *) echo "$1 is not an option" ;;
        esac
        shift
    done
    # 剩餘位置參數
    for param in "$@"; do echo "Parameter: $param"; done
}

優點:邏輯完全自定義,無限制;
缺點:代碼冗長,易出錯,需手動 shift。

方案二:getopt(外部命令,半自動)


getopt_act() {
    GETOPTOUT=`getopt ab:c:d "$@"`
    set -- $GETOPTOUT
    while [ -n "$1" ]; do
        case $1 in
            -a) echo "Found -a" ;;
            -b) echo "Found -b, param: $2"; shift ;;
            -c) echo "Found -c, param: $2"; shift ;;
            -d) echo "Found -d" ;;
            --) shift; break ;;
            *) echo "Unknown: $1" ;;
        esac
        shift
    done
    for param in "$@"; do echo "Parameter: $param"; done
}

優點:自動重組選項與參數,用 -- 分隔;
缺點:不支持參數中包含空格(如 -c "earth moon" 會解析錯誤),需配合 set -- 手動 shift。

方案三:getopts(內置命令,推薦)


getopts_act() {
    while getopts ":ab:c:d" ARGS; do
        case $ARGS in
            a) echo "Found -a" ;;
            b) echo "Found -b, param: $OPTARG" ;;
            c) echo "Found -c, param: $OPTARG" ;;
            d) echo "Found -d" ;;
            *) echo "Unknown: $ARGS" ;;
        esac
    done
    shift $((OPTIND-1))
    for param in "$@"; do echo "Parameter: $param"; done
}

優點:支持參數含空格(-c "earth moon")、選項字母與參數可無空格(-bdog)、未定義選項自動綁定到 ?;
缺點:僅支持短選項(單字母),不支持長選項(--long)。

對比總結表

特性手寫 casegetoptgetopts
參數含空格支持不支持支持
選項緊鄰參數(-bdog)需自行處理支持支持
長選項(--long)支持支持不支持
代碼複雜度高中低
移植性最好依賴外部getoptBash/Ksh內置

選型建議

  • 簡單短選項、需空格參數 → getopts;
  • 需長選項、跨平台 → getopt 或手寫;
  • 極其特殊邏輯 → 手寫 case。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved