【问题标题】:How to use getopt with this several values?如何将 getopt 与这几个值一起使用?
【发布时间】:2014-03-17 15:31:43
【问题描述】:

我尝试实现具有多个选项的脚本。我从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

【问题讨论】:

  • 运行你的脚本sh -x ./opt2.sh .....
  • 如果我在 opt2.sh 上使用 chmod +x 则不会。
  • @aloisdg Kevin 提到的-x 并不意味着执行,它设置了 xtrace shell 选项,该选项将导致 shell 脚本执行的每个语句都打印到控制台。这样你就可以看到你的脚本哪里出错了。

标签: bash sh getopt


【解决方案1】:

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

【讨论】:

  • verbose,format:type:style: 我猜?我现在就试试。
  • 我觉得你少了几个逗号
  • 哪里少了几个逗号?它像这样完美地工作。我应该添加缺少的逗号吗?
  • @aloisdg,这意味着 verbose,format:,type:,style: 更具可读性/可维护性,即使您似乎不需要冒号后的逗号。
  • @aloisdg 您是否使用不带逗号的脚本测试了长选项?
【解决方案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' --

【讨论】:

  • 没想到,但是是的!
猜你喜欢
  • 2021-11-23
  • 1970-01-01
  • 2017-05-09
  • 2015-07-03
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多