1

我有一个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为 as-jvalue3-pvalue2as -e2

4

3 回答 3

1

您可以在之后添加休息j)

#!/bin/bash
while getopts ":j:e:" option; do
    case "$option" in
        j) MYHOSTNAME=$OPTARG ; break ;;
        e) SCRIPT_PATH=$OPTARG ;;
        *) ;;
    esac
done

echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"

输出:

$ bash test.sh -jvalue1 -Djvalue3 -pvalue2
j=value1
e=
remaining=-Djvalue3 -pvalue2

选项/参数之间带有空格的输出:

$ bash test.sh  -jvalue1 -evalue4 -D jvalue3  -p value2
j=value1
e=value4
remaining=jvalue3 -p value2
于 2012-08-01T07:33:55.950 回答
1

在 3 个论坛上发布并到处搜索之后……最终我尝试了以下方法,它奏效了……

testShell.sh  -jvalue1 -evalue4 -- -Djvalue3  -pvalue2

注意

--  

-evalue4

输出是

j=value1
e=value4
remaining=-Djvalue3 -pvalue2

我相信--要求getopts停止处理选项。

编辑: 是解释其工作原理的链接。

于 2012-08-01T10:11:36.740 回答
1

您可以手动进行选项处理:

set -- -jvalue1 -evalue4 -Djvalue3 -pvalue2

remaining=()
for arg; do
    case $arg in
        -j*) j=${arg#-j} ;;
        -e*) e=${arg#-e} ;;
        *)   remaining+=($arg) ;;
    esac
done
printf "%s='%s'\n" j "$j" e "$e" remaining "${remaining[*]}"

哪个输出

j='value1'
e='value4'
remaining='-Djvalue3 -pvalue2'

这样,您不必依赖用户以特定方式输入参数,例如--在中间添加,或强制-j-e先来。

于 2012-08-01T11:19:50.010 回答