我尝试使用多个选项来实现脚本。我从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
答案 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' --