17

我正在尝试创建一个 getopt 命令,这样当我将“-ab”参数传递给脚本时,该脚本会将 -ab 视为单个参数。

#!/bin/sh
args=`getopt "ab":fc:d $*`
set -- $args
for i in $args
do
case "$i" in
        -ab) shift;echo "You typed ab $1.";shift;;
        -c) shift;echo "You typed a c $1";shift;;
esac
done

但是,这似乎不起作用。任何人都可以提供任何帮助吗?

4

4 回答 4

14

getopt 不支持您要查找的内容。您可以使用单字母 ( -a) 或长选项 ( --long)。like-ab的处理方式与-a b: as option awith argument相同b。请注意,长选项以两个破折号为前缀。

于 2010-10-20T06:19:40.037 回答
1

我为此苦苦挣扎了很长时间-然后我开始阅读有关 getopt 和 getopts 的内容

单字符选项和长选项。

我有类似的要求,我需要有多个多字符输入参数。

所以,我想出了这个-它在我的情况下有效-希望这对你有帮助

function show_help {
    echo "usage:  $BASH_SOURCE --input1 <input1> --input2 <input2> --input3 <input3>"
    echo "                     --input1 - is input 1 ."
    echo "                     --input2 - is input 2 ."
    echo "                     --input3 - is input 3 ."
}

# Read command line options
ARGUMENT_LIST=(
    "input1"
    "input2"
    "input3"
)



# read arguments
opts=$(getopt \
    --longoptions "$(printf "%s:," "${ARGUMENT_LIST[@]}")" \
    --name "$(basename "$0")" \
    --options "" \
    -- "$@"
)


echo $opts

eval set --$opts

while true; do
    case "$1" in
    h)
        show_help
        exit 0
        ;;
    --input1)  
        shift
        empId=$1
        ;;
    --input2)  
        shift
        fromDate=$1
        ;;
    --input3)  
        shift
        toDate=$1
        ;;
      --)
        shift
        break
        ;;
    esac
    shift
done

注意 - 我已根据我的要求添加了帮助功能,如果不需要,您可以将其删除

于 2019-04-02T09:40:32.087 回答
1

这不是 unix 方式,尽管有些人这样做,例如java -cp classpath.

Hack:代替-ab arg, have-b arg和一个虚拟选项-a.

这样,-ab arg做你想做的事。(-b arg也会;希望这不是一个错误,而是一个快捷功能......)。

唯一的变化是你的行:

-ab) shift;echo "You typed ab $1.";shift;;

变成

-b) shift;echo "You typed ab $1.";shift;;
于 2019-07-05T20:00:45.600 回答
-4

getopt 支持长格式。你可以搜索这样的例子。例如,请参见此处

于 2010-10-20T05:31:14.497 回答