我正在使用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 -- '-'
我在这里缺少什么?
答案 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"
创建了一个参数,其中有三个是预期的。