Shell脚本:如何使getopts只读第一个字符`-`

时间:2012-08-01 07:29:13

标签: bash shell parameters getopt

我有一个使用testShell.sh的shell脚本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解释为-e2

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在3个论坛上发布并在任何地方搜索后...最终我尝试了以下内容并且有效...

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

注意

--  
-evalue4

之后

输出

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

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

编辑: Here是解释这项工作的链接。

答案 2 :(得分: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来第一