如何让 getopts 只读取第一个字符“-”

如何让 getopts 只读取第一个字符“-”

我有一个 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-pvalue2as -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相信停止处理选项。

相关内容