Linux 用于标志和选项解析的getopts

Linux 用于标志和选项解析的getopts,linux,bash,shell,automation,Linux,Bash,Shell,Automation,我在我的脚本中使用getopts,我想按照下面的选项解析顺序使用它 ./myscript -c server ./myscript -c -h server ./myscript server -c ./myscript -h server -c ./myscript server 我正在使用myscript,如下所示 #!/bin/bash while getopts c:h: var do case $var in h) host=$OPTARG;; c) FLAG=1 esac don

我在我的脚本中使用getopts,我想按照下面的选项解析顺序使用它

./myscript -c server
./myscript -c -h server
./myscript server -c
./myscript -h server -c
./myscript server
我正在使用myscript,如下所示

#!/bin/bash
while getopts c:h: var
do
case $var in 
h) host=$OPTARG;;
c) FLAG=1
esac
done

这里的“server”是一个参数,应该加载偶数-h选项指定与否,以及我正在使用的-c选项作为标志。是否有办法实现这一点。

有时最好不要使用
getopts

#!/bin/bash

while [[ $# -gt 0 ]]; do
    case "$1" in
    -c)
        FLAG=1
        ;;
    -h)
        HOST=$2
        shift
        ;;
    -*)
        echo "Unknown option: $1"
        exit 1
        ;;
    *)
        HOST=$1
        ;;
    esac
    shift
done
顺便说一下,脚本会给您一个语法错误,因为您遗漏了两个分号:

c) FLAG=1 ;;

我通过应用一些额外的验证解决了我的问题

#!/bin/bash

USAGE() {
        echo "Invalid Option"
        exit 1
}

if [ $# -eq 2 ]; then
                case $1 in
                        -c) FLAG=1; host=$2 ;;
                        -h) host=$2 ;;
                esac
                if [ -z "$host" ]; then
                case $2 in
                        -c) FLAG=1; host=$1;;
                        -h) host=$1;;
                        *) USAGE;;
                esac
                fi
        else

        while getopts q:c:h: OPTION
        do
            case ${OPTION} in
                q) USAGE;;
                h) host=$OPTARG;;
                c) FLAG=1 ;;
                *)USAGE;;
            esac
        done
fi

if [ $# -eq 1 ]; then host=$1 ;fi

echo Host = $host FLag = $FLAG
在所有情况下,我都在脚本中获取主机,如此输出所示

$ ./myscript.sh server1
Host = server1 FLag =
$ ./myscript.sh -c server1
Host = server1 FLag = 1
$ ./myscript.sh server1 -c
Host = server1 FLag = 1
$ ./myscript.sh server1 -h
Host = server1 FLag =
$ ./myscript.sh -h server1
Host = server1 FLag =

是的,你的剧本怎么样?你试过写什么吗?问题是什么?是的,你是对的,我在键入脚本时错过了语法。因为我的脚本需要更多的参数,所以我按照自己的答案制作了脚本。谢谢你的帮助。你的答案比我的更完美。非常感谢。