如何使用这几个值的getopt?

时间:2014-03-17 15:31:43

标签: bash sh getopt

我尝试使用多个选项来实现脚本。我从doc开始,得到一些错误,转到浏览器。阅读一些链接并在SO上找到:Using getopts in bash shell script to get long and short command line options

所以我读了它并重写了我的脚本。我在某处弄错了。我哪里错了?

SH

#!/bin/sh

TEMP=`getopt -o vfts: --long verbose,format,type,style: \
             -n 'opt2' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

eval set -- "$TEMP"

VERBOSE=false
FORMAT=
TYPE=
STYLE=
while true; do
    case "$1" in
        -v | --verbose ) VERBOSE=true; shift ;;
        -f | --format ) FORMAT="$2"; shift 2 ;;
        -t | --type ) TYPE="$2"; shift 2 ;;
        -s | --style ) STYLE="$2"; shift 2 ;;
        -- ) shift; break ;;
        -*) break ;;
        * ) break ;;
    esac
done

echo "verbose = $VERBOSE"
echo "format = $FORMAT"
echo "type = $TYPE"
echo "style = $STYLE"

输出

> ./opt2.sh -v -f fofo -t toto -s soso

verbose = true // ok
format = -t // should be fofo
type =  // should be toto
style = soso // ok

2 个答案:

答案 0 :(得分:4)

您的选项字符串错误,应为vf:t:s:。冒号表示除v之外的每个选项都必需的参数。还需要相应地调整长选项字符串。

答案 1 :(得分:2)

你可以很容易地自己做一些调试:

$ set -- -v -f fofo -t toto -s soso
$ TEMP=$(getopt -o vfts: --long verbose,format,type,style: -- "$@")
$ echo "$TEMP"
 -v -f -t -s 'soso' -- 'fofo' 'toto'

嗯,您的-f-t参数已断开连接。需要它们

$ TEMP=$(getopt -o vf:t:s: --long verbose,format:,type:,style: -- "$@")
$ echo "$TEMP"
 -v -f 'fofo' -t 'toto' -s 'soso' --

要证明--long定义中显然没有严格要求逗号:

$ TEMP=$(getopt -o vf:t:s: --long verbose,format:type:style: -- "$@")
$ echo $?; echo "$TEMP"
0
 -v -f 'fofo' -t 'toto' -s 'soso' --