无效选项 -- ' ' 和 '-'
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"
创建了一个参数,而预期是三个参数。
我正在使用 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"
创建了一个参数,而预期是三个参数。