我有一个 shell 脚本testShell.sh
,其使用getopts
如下:
#!/bin/bash
while getopts ":j:e:" option; do
case "$option" in
j) MYHOSTNAME=$OPTARG ;;
e) SCRIPT_PATH=$OPTARG ;;
*) ;;
esac
done
echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"
当我测试运行时,如下所示:
$ testShell.sh -jvalue1 -evalue4 -Djvalue3 -pvalue2
我得到的输出如下:
j=value3
e=2
remaining=
但我希望输出为:
j=value1
e=value4
remaining=-Djvalue3 -pvalue2
是否可以确保 getopts
只看第一个字符帖子 -
象征?这样它就不会解释-Djvalue3
为-jvalue3
和-pvalue2
as -e2
。
答案1
尝试这个:
$ ./testShell.sh -j value1 -e value4 -D jvalue3 -p value2
j=value1
e=value4
remaining=jvalue3 -p value2
请注意选项和选项字符串之间的空格。
help getopts
说:
OPTSTRING contains the option letters to be recognized; if a letter
is followed by a colon, the option is expected to have an argument,
which should be separated from it by white space.
即选项和任何选项字符串之间需要空格。
如果您需要的功能超出了 bash 内置 getopt 的功能,则 /usr/bin/getopt 实用程序支持长选项和短选项,选项和选项字符串之间有或没有空格。还支持额外的功能,例如可选的字符串参数。
顺便说一句, /usr/bin/getopt 在 debian 和 ubuntu 等衍生产品中的 util-linux 包中可用...不知道其他发行版或 *nixes,但如果您找不到源代码,可以从 debian 档案中找到它其他任何地方。
答案2
将其发布到 3 个论坛并到处搜索后...最终我尝试了以下方法并且成功了...
testShell.sh -jvalue1 -evalue4 -- -Djvalue3 -pvalue2
注意
--
后-evalue4
输出是
j=value1
e=value4
remaining=-Djvalue3 -pvalue2
我相信--
问getopts
相信停止处理选项。