Я пишу сценарий Bash для анализа параметров командной строки, а затем выполняю нужную функцию.
#!/bin/bash
TEMP=`getopt --longoptions help --options h --name 'script.sh' -- "$@"`
if [ $? != 0 ] ; then
echo "Try 'script.sh --help' for more information." >&2 ;
exit 1 ;
fi
eval set -- "$TEMP"
while true ; do
case "$1" in
-h|--help)
echo "Usage:";
exit 0;;
--)
shift ;
break ;;
*)
echo "Internal error!" ;
exit 1 ;;
esac
done
echo "Remaining arguments:"
for arg do
echo '--> '"'$arg'" ;
done
./script.sh --
выводит
Remaining arguments:
Все из
./script.sh --h
./script.sh --he
./script.sh --hel
./script.sh --help
выход
Usage:
и ./script.sh --helps
выходы
script.sh: unrecognized option '--helps' Try 'script.sh --help' for more information.
Как сделать так, чтобы усеченные параметры не распознавались как полный вариант? Я не могу найти ничего похожего на «конец строки» в шаблонах Bash. Почему --
не определяется как начало --help
?
От человека getopt:
Долгие опции могут быть сокращены, пока сокращение не неоднозначно.
Таким образом, пока сокращение не неоднозначно, оно будет сокращено. Вы могли добавить некоторую другую опцию сделать это неоднозначным:
TEMP=`getopt --longoptions help helpx --options h --name 'script.sh' -- "$@"`
Даст Вам что-то как:
./script.sh --he
script.sh: option '--he' is ambiguous; possibilities: '--help' '--helpx'
Try 'script.sh --help' for more information.
вместо опций дескриптора более универсальным способом необходимо заботиться о тех опциях, которыми Вы интересуетесь
for i in "$@"; do
case $i in
-h|--help)
echo "usage"
exit 0
;;
--one|--two|--tree)
continue
;;
*)
echo "error"
exit 1
;;
esac
done