如何在 bash 脚本中编写 getopt

How to write getopt in bash script

我有一个带有几个参数的函数。例如:

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 "" in
    -m|--mode)
        makeUser)
           case "" in
              -l|--login)
                 makeUser "$OPTARG"
                    case "" in
                       -e|--email)
                           makeUser "$OPTARG"
                              case "" in
                                 -p|--password)
                                     makeUser "$OPTARG"
                                     exit $?
                               esac ;;
                    exit $?
                    esac ;;       
            exit $?
            esac ;;    
        makeProject)...
        makeSite)...
    exit $?    
    esac ;;
done

使用 whileshift 为 bash 中类似 getopt 的行为提供了一个干净的解决方案:

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

# example function makeUser
makeUser()
{
    login=
    email=

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


if [ "$MODE" == "makeUser" ]; then
    makeUser $LOGIN $EMAIL # ... and so on
fi