работа с параметрами в коде bash

Возможный дубликат:
Использование getopts в сценарии оболочки bash для получения длинных и коротких параметров командной строки

Я пытаюсь понять, как использовать, например, флаг -e / - email -h / - help.

ОБНОВЛЕНИЕ: Текущий пример:

while getopts ":ec:h" OptionArgument; do
case $OptionArgument in

        e ) S1=${OPTARG};;
        c ) S2=${OPTARG};;
        h ) usage;;
        \?) usage;;
        * ) usage;;
esac
done

Однако, если я оставлю поле пустым, он ничего не сделает. Если я добавлю -h, он все равно будет работать и не будет показывать использование.

ОБНОВЛЕНИЕ2

while [ $1 ]; do
        case $1 in
                '-h' | '--help' | '?' )
                        usage
                        exit
                        ;;
                '--conf' | '-c' )

                        ;;
                '--email' | '-e' )
                        EMAIL=$1
                        ;;
                * )
                        usage
                        exit
                        ;;
        esac
        shift
done

-h / - справка работает, но все остальное не работает и отображает использование.


person Amanada Smith    schedule 08.10.2012    source источник
comment
getopts Bash не поддерживает длинные аргументы, только однобуквенные. См. этот ответ, чтобы getopt GNU делал то, что вы хотите.   -  person Telemachus    schedule 09.10.2012
comment
Обновил вопрос и пока наполовину работает   -  person Amanada Smith    schedule 09.10.2012
comment
Вам понадобится дополнительный shift для --email дела и EMAIL=$2   -  person glenn jackman    schedule 09.10.2012


Ответы (1)


Если вам нужны длинные варианты, подобные GNU, и короткие, просмотрите этот скрипт как источник в вашем скрипте http://stchaz.free.fr/getopts_long.sh и пример:

Пример :

#!/bin/bash
# ( long_option ) 0 or no_argument,
# 1 or required_argument, 2 or optional_argument).

Help() {
cat<<HELP
Usage :
    $0 [ --install-modules <liste des modules> ] [-h|--help]
HELP
    exit 0
}

. /PATH/TO/getopts_long.sh

OPTLIND=1
while getopts_long :h opt \
    install-modules 1 \
    help 0 "" "$@"
do
    case "$opt" in
        install-modules)
            echo $OPTLARG
        ;;
        h|help)
            Help; exit 0
        ;;
        :)
           printf >&2 '%s: %s\n' "${0##*/}" "$OPTLERR"
           Help
           exit 1
        ;;
    esac
done
shift "$(($OPTLIND - 1))"
person Gilles Quenot    schedule 09.10.2012