Как я могу разбирать аргументы длинной формы в оболочке?

Все, что я вижу, использует getopt или слегка-fancier getopts, который поддерживает только односимвольные параметры (например, -h, но не --help). Я хочу сделать очень долгое время.

Ответ 1

Я сделал что-то вроде this:

_setArgs(){
  while [ "$1" != "" ]; do
    case $1 in
      "-c" | "--configFile")
        shift
        configFile=$1
        ;;
      "-f" | "--forceUpdate")
        forceUpdate=true
        ;;
      "-r" | "--forceRetry")
        forceRetry=true
        ;;
    esac
    shift
  done
}

Как вы можете видеть, это поддерживает как односимвольные, так и более длинные параметры. Он позволяет связать значения с каждым аргументом, как в случае --configFile. Он также довольно расширяемый, без каких-либо искусственных ограничений относительно того, какие параметры могут быть настроены и т.д.

Ответ 2

Предполагая, что вы "хотите делать большие варианты" независимо от инструмента, просто перейдите с getopt (getopts, по-видимому, в основном используется, когда важна мобильность). Здесь пример о максимальной сложности, которую вы получите:

params="$(getopt -o e:hv -l exclude:,help,verbose --name "$(basename "$0")" -- "[email protected]")"

if [ $? -ne 0 ]
then
    usage
fi

eval set -- "$params"
unset params

while true
do
    case $1 in
        -e|--exclude)
            excludes+=("$2")
            shift 2
            ;;
        -h|--help)
            usage
            ;;
        -v|--verbose)
            verbose='--verbose'
            shift
            ;;
        --)
            shift
            break
            ;;
        *)
            usage
            ;;
    esac
done

С помощью этого кода вы можете указать -e/--exclude более одного раза, а ${excludes[@]} будет содержать все данные исключений. После обработки (-- всегда присутствует) все остальное сохраняется в [email protected].