无效选项 -- ' ' 和 '-'

Invalid option -- ' ' and '-'

我正在使用 getopt 来解析我的命令行参数。我的脚本用于启动、停止、重新启动和获取守护进程的状态。我知道我可以编写一个初始化脚本,但我需要我的脚本在很大程度上可以移植到 Linux 机器上。

我的脚本只需要一个命令和几个选项。用法是这样的:

activemq start -f
activemq start --foreground
activemq stop -k
activemq stop --kill
activemq restart
activemq start

这是我对选项的解析逻辑,即 及以后的选项:

options="${@:$((+2))}"

set -- $(getopt -o fk --long foreground,kill -- "$options")

foreground=no
killprocess=no

while [ $# -gt 0 ] ; do
    case "" in 
        -f | --foreground) 
            foreground=yes
            shift
            ;;
        -k | --kill)
            killprocess=yes
            shift
            ;;
        --)
            shift
            ;;
        *)
            echo "Error: unrecognized option: " >&2
            usage
            ;;
    esac
done

echo "command=$command, foreground=$foreground, killprocess=$killprocess"

以下调用一切正常:

activemq restart -fk

但是,如果我尝试将它们分成单独的参数,它就会中断

$ activemq restart -f -k
getopt: invalid option -- ' '
getopt: invalid option -- '-'

我在这里错过了什么?

options 需要是一个数组。替换为:

options="${@:$((+2))}"
set -- $(getopt -o fk --long foreground,kill -- "$options")

有了这个:

options=("${@:$((+2))}")
set -- $(getopt -o fk --long foreground,kill -- "${options[@]}")

getopt 期望每个选项字符串都是一个单独的参数。通过使用数组,单独的参数保持分开。

最小示例

首先,让我们设置一些位置参数:

$ set restart -- -k -f

现在,让我们使用 bash 个数组:

$ options=("${@:$((+2))}")
$ printf '>>%s\n' "${options[@]}"
>>--
>>-k
>>-f

printf 语句表明每个位置参数保持独立。

现在,尝试不使用数组:

$ options="${@:$((+2))}"
$ printf '>>%s\n' "$options"
>>-- -k -f

printf 显示 "$options" 创建了一个参数,而预期是三个参数。