简体   繁体   English

如何在bash结尾处使用不带参数的getopts选项

[英]How to use getopts option without argument at the end in bash

I want to use getopts in bash. 我想在bash中使用getopts。 The user should select his own options. 用户应该选择自己的选项。 most of the options gets arguments but there are 2 options that does not gets an argument. 大多数选项都有参数,但有两个选项没有参数。 It works good when the option without the argument is at the middle of the command, but when it is at the end it does not work. 当没有参数的选项位于命令的中间时,它工作正常,但是当它在结尾时它不起作用。

Note - the first two arguments (Server and Password) are mandatory and not a part of the getopts. 注意 - 前两个参数(服务器和密码)是必需的,而不是getopts的一部分。

#!/bin/bash

SERVER=${1}
PASSWORD=${2}
VERSION=v0
ASKED_REVISION=0
DB=schema_1
PROPERTIES=1
FULL=0
USER=

# Usage info
show_help()
{
echo "
        Usage: Environment DBPassword [-V Version] [-R Revision] [-S Schema] [-P] [-F] [-U Username]

        -V Version      Version to deploy.
        -R Revision     Revision number (0 means the latest revision).
        -S Schema       Schema in the DB to deploy.
        -P              No(!) External Properties. If this flag is marked the deploy will not copy the external properties
        -F              Full deploy
        -U              Username. This User who run the deploy.

        For Example: ./deploy server1 123456 -V v1.0 -R 12345 -S schema1 -P -F -U User1

        -H              Help
"
}
OPTIND=3
while getopts ":V:R:S:P:F:U:H:" FLAG; do
  case "$FLAG" in
        V) # Set option "V" [Version]
                VERSION=$OPTARG
                ;;
        R) # Set option "R" [Revision]
                ASKED_REVISION=$OPTARG
                ;;
        S) # Set option "S" [Schema]
                DB=$OPTARG
                ;;
        P) # Set option "P" [No External Properties]
                PROPERTIES=0
                OPTIND=$OPTIND-1
                ;;
        F) # Set option "F" [FULL]
                FULL=1
                OPTIND=$OPTIND-1
                ;;


 U) # Set option "U" [User]
            USER=$OPTARG
            ;;
    H) # help
            show_help
            ;;
    \?)
            echo "Invalid option: -$OPTARG. Use -H flag for help."
            exit
            ;;
  esac
done

shift $((OPTIND-1))  #This tells getopts to move on to the next argument.

echo "Env=$SERVER"
echo "Pass=$PASSWORD"
echo "Version=$VERSION"
echo "Revision=$ASKED_REVISION"
echo "Schema=$DB"
echo "External Properties=$PROPERTIES"
echo "FULL=$FULL"
echo "USER=$USER"

-F and -P shouldn't get an argument. -F和-P不应该得到一个参数。 When I run this command it works correctly (-F in the middle): 当我运行此命令时,它正常工作(中间的-F):

./deploy_test.sh server1 pass1234 -U 555 -R 55555 -F -V v1.0

When the -F or -P are in the end of the command, This line is not working correctly (everything works good but the -F): 当-F或-P在命令的末尾时,此行无法正常工作(一切正常,但-F):

./deploy_test.sh server1 pass1234 -U 555 -R 55555 -V v1.0 -F

Remove the colons from the options that don't require arguments, and don't manually do any shifting or changing of OPTIND yourself within the while / case statment (you'll still need to set OPTIND prior to the while loop to skip the first 2 arguments): 卸下不需要的参数选项的冒号,而不用手动做任何移动或改变OPTIND的内自己while / case statment(你仍然需要设置OPTIND while循环之前跳过第一2个论点):

while getopts ":V:R:S:PFU:H" FLAG; do

I've shown the while line with the appropriate changes for the P and F options as well as for H since it also wouldn't require an argument. 我已经显示了对于PF选项以及H的适当更改的while行,因为它也不需要参数。

As per the documentation : 根据文件

if a character is followed by a colon, the option is expected to have an argument 如果一个字符后面跟一个冒号,那么该选项应该有一个参数

So the : should only be there for options with arguments. 所以:应该只有那些带参数的选项。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM