腳本調用:script -a -b dog -c "earth moon" -d -f param1 param2
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_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_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)。
| 特性 | 手寫 case | getopt | getopts |
|---|---|---|---|
| 參數含空格 | 支持 | 不支持 | 支持 |
| 選項緊鄰參數(-bdog) | 需自行處理 | 支持 | 支持 |
| 長選項(--long) | 支持 | 支持 | 不支持 |
| 代碼複雜度 | 高 | 中 | 低 |
| 移植性 | 最好 | 依賴外部getopt | Bash/Ksh內置 |