Все, что я вижу, использует 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]
.