选项无效 - ' '和' - '

时间:2015-01-30 22:49:06

标签: bash getopt

我正在使用getopt来解析我的命令行参数。我的脚本用于启动,停止,重新启动和获取守护程序的状态。我知道我可以写一个init脚本,但是我需要我的脚本在Linux机器上很容易移植。

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

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

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

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

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

foreground=no
killprocess=no

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

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

以下调用一切正常:

activemq restart -fk

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

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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

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

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

有了这个:

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

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

最小的例子

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

$ set restart -- -k -f

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

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

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

现在,尝试不使用数组:

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

printf表明"$options"创建了一个参数,其中有三个是预期的。