Как написать getopt в скрипте bash

У меня есть функция с несколькими параметрами. Например:

makeUser{
login
email
password}

Я хочу сделать флаги как -l|--login, -e|--email а также -p|--password но я не знаю как.

Пример для этого должен выглядеть следующим образом:

./script.sh --mode makeUser --login test --email test@test.com -p testxx

Как я могу достичь этого результата? Я знаю только, как сделать это с помощью getopts (короткие флаги).

Должно ли это выглядеть как код ниже?

while true ; do
case "$1" in
    -m|--mode)
        makeUser)
           case "$2" in
              -l|--login)
                 makeUser "$OPTARG"
                    case "$3" in
                       -e|--email)
                           makeUser "$OPTARG"
                              case "$4" in
                                 -p|--password)
                                     makeUser "$OPTARG"
                                     exit $?
                               esac ;;
                    exit $?
                    esac ;;       
            exit $?
            esac ;;    
        makeProject)...
        makeSite)...
    exit $?    
    esac ;;
done

1 ответ

Решение

С помощью while а также shift делает чистое решение для поведения, похожего на getopt в bash:

while [ $# -gt 0 ]; do
    case "$1" in
        -h|"-?"|--help)
            shift
            echo "usage: $0 [-v] [--mode MODE] [-l login] [-e email] [...]"
            exit 0
            ;;
        --mode)
            MODE=$2
            shift; shift;
            ;;
        -l|--login)
            LOGIN=$2
            shift; shift;
            ;;
        -e|--email)
            EMAIL=$2
            shift; shift;
            ;;
        -v|--verbose)
            VERBOSE=1
            shift;
            ;;
         *)
            echo "Error: unknown option '$1'"
            exit 1
        esac
done

# example function makeUser
makeUser()
{
    login=$1
    email=$2

    echo "function makeUser with login=${login} and email=${email}"
}


if [ "$MODE" == "makeUser" ]; then
    makeUser $LOGIN $EMAIL # ... and so on
fi
Другие вопросы по тегам