Linux getopt不';不支持Bash中选项之间的空格?

Linux getopt不';不支持Bash中选项之间的空格?,linux,bash,getopt,Linux,Bash,Getopt,因此,我的getopt代码如下所示: ARG_H=0 ARG_V=0 ARG_A=0 ARG_N=5 TEMP=`getopt -o hvn:a -n "vdu" -- "$1"` eval set -- "$TEMP" while true ; do case "$1" in -h|--argh) ARG_H=1 ; shift ;;

因此,我的getopt代码如下所示:

    ARG_H=0
    ARG_V=0
    ARG_A=0
    ARG_N=5

    TEMP=`getopt -o hvn:a -n "vdu" -- "$1"`
    eval set -- "$TEMP"
    while true ; do
            case "$1" in
                    -h|--argh) ARG_H=1 ; shift ;;
                    -v|--argv) ARG_V=1 ; shift ;;
                    -n|--argn)
                            case "$2" in
                            "") shift 2 ;;
                            *) ARG_N=$2 ; shift 2 ;;
                            esac ;;
                    -a|--arga) ARG_A=1 ; shift ;;
                    --) shift ; break ;;
                    *) echo "error" ; exit 1 ;;
            esac
    done
    echo "$ARG_H"
    echo "$ARG_V"
    echo "$ARG_N"
    echo "$ARG_A"
./vdu -a-v-n15
但出于某种原因,只有当我的命令行如下所示时,它才起作用:

    ARG_H=0
    ARG_V=0
    ARG_A=0
    ARG_N=5

    TEMP=`getopt -o hvn:a -n "vdu" -- "$1"`
    eval set -- "$TEMP"
    while true ; do
            case "$1" in
                    -h|--argh) ARG_H=1 ; shift ;;
                    -v|--argv) ARG_V=1 ; shift ;;
                    -n|--argn)
                            case "$2" in
                            "") shift 2 ;;
                            *) ARG_N=$2 ; shift 2 ;;
                            esac ;;
                    -a|--arga) ARG_A=1 ; shift ;;
                    --) shift ; break ;;
                    *) echo "error" ; exit 1 ;;
            esac
    done
    echo "$ARG_H"
    echo "$ARG_V"
    echo "$ARG_N"
    echo "$ARG_A"
./vdu -a-v-n15

但是如果我输入

./vdu -a -v -n 15
它将只注册第一个标志。为什么会这样?这段代码似乎与我一直在看的getopts教程完全相同

TEMP=`getopt -o hvn:a -n "vdu" -- "$1"`
$1
只是程序的第一个参数。使用
$@
传递所有参数

TEMP=`getopt -o hvn:a -n "vdu" -- "$@"`
其他想法:

  • 传统做法是将
    $0
    传递给
    -n
    ,而不是硬编码程序名
  • 如果将
    eval set
    getopt
    调用结合使用,则可以跳过临时变量
  • 使用
    $(…)
    代替
    ```
    被认为是一种很好的风格<代码>$(…)可以更容易地嵌套
结果:

eval set -- "$(getopt -o hvn:a -n "$0" -- "$@")"
$1
只是程序的第一个参数。使用
$@
传递所有参数

TEMP=`getopt -o hvn:a -n "vdu" -- "$@"`
其他想法:

  • 传统做法是将
    $0
    传递给
    -n
    ,而不是硬编码程序名
  • 如果将
    eval set
    getopt
    调用结合使用,则可以跳过临时变量
  • 使用
    $(…)
    代替
    ```
    被认为是一种很好的风格<代码>$(…)可以更容易地嵌套
结果:

eval set -- "$(getopt -o hvn:a -n "$0" -- "$@")"

啊,非常感谢。我认为,由于我是在函数中执行此操作,因此必须将$@作为参数传入,并使用$!在getopt命令中,显然不是这样。啊,非常感谢。我认为,由于我是在函数中执行此操作,因此必须将$@作为参数传入,并使用$!在getopt命令中,显然不是这样。