【问题标题】:How to write getopt in bash script [duplicate]如何在 bash 脚本中编写 getopt [重复]
【发布时间】:2015-10-30 21:42:06
【问题描述】:

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

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

【问题讨论】:

  • 嗯,所有的选项都应该在同一个缩进级别。
  • 你能回答并给我看吗?前缀(-l|--login、-e|--email、-p|--password)呢?
  • 这应该会有所帮助:stackoverflow.com/questions/4180880/…
  • 这些选项是否有合理的默认值?如果不是,您应该将它们保留为位置参数,而不是选项。如果您只想要描述性的选项,您可以要求login=test email=test@example.com password=testxx 形式的参数并在您的脚本中解析它们。 (这很容易做到;我可以发布带有详细信息的答案。)
  • 他们应该坚守岗位的重要原因之一。例如我有方法:assignProject,我需要变量:用户+项目+访问级别,还有一个方法makeUser,我需要登录名+电子邮件+密码。如果您可以在答案中发布一些包含详细信息的代码,我将不胜感激!谢谢!!

标签: bash shell getopt getopts getopt-long


【解决方案1】:

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

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

【讨论】:

  • Okey 但是如何设置那个参数应该是 3rd ?我的意思是串联知道 makeUser 的第一个参数是 login ,然后 email 不是密码,最后是密码?看不懂
  • --mode makeUser --login test--login test --mode makeUser 调用脚本应该没有区别?
  • 我稍后会使用 curl 选项,所以我在每个函数中都有指定的参数序列,这就是我问的原因。我的另一个问题是 shift 是如何真正起作用的?因为我用 getops 制作了这个脚本(并且它有效)但我没有使用 shift 选项。
  • 我更新了答案,以更好地匹配您的问题。 hth.
  • 我添加了一个带有两个参数的示例函数。
猜你喜欢
  • 2013-12-25
  • 2014-06-09
  • 1970-01-01
  • 2013-09-29
  • 2022-11-24
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2022-10-19
相关资源
最近更新 更多