Getopt Long Options Parsing
Parse long and short options robustly with getopt, validating required flags, defaults, and positional arguments.
Code
#!/usr/bin/env bash
set -euo pipefail
# 选项定义:短串加长定义,冒号表示需要参数
readonly SHORT="vo:t:"
readonly LONG="verbose,output:,timeout:"
PARSED=$(getopt --alternative --options "${SHORT}" \
--longoptions "${LONG}" --name "$0" -- "$")
eval set -- "${PARSED}"
VERBOSE=false
OUTPUT="./out"
TIMEOUT=30
while true; do
case "$1" in
-v | --verbose) VERBOSE=true; shift ;;
-o | --output) OUTPUT="$2"; shift 2 ;;
-t | --timeout)
[[ "$2" =~ ^[0-9]+$ ]] || { echo "超时须为数字: $2" >&2; exit 2; }
TIMEOUT="$2"; shift 2 ;;
--) shift; break ;;
*) echo "未知参数: $1" >&2; exit 2 ;;
esac
done
[[ $# -ge 1 ]] || { echo "用法: $0 [-v] [-o 输出] [-t 超时] <输入...>" >&2; exit 2; }
readonly TIMEOUT
readonly OUTPUT
echo "verbose=${VERBOSE} output=${OUTPUT} timeout=${TIMEOUT}"
for input in "$@"; do
[[ -f "$input" ]] || { echo "输入不存在: ${input}" >&2; exit 1; }
echo "处理 ${input} -> ${OUTPUT}"
done
Report a problem with this exampleOpens a pre-filled issue on GitHub.