【问题标题】:how to use getopt/getopts如何使用 getopt/getopts
【发布时间】:2015-05-22 03:35:31
【问题描述】:

所以,我已经学会了如何在我的 bash 脚本中传递参数。对我来说,下一步是传递一个带有参数的标志。例如,-id 12345-d YES-d NO-h localhost

所以,我希望像这样执行: ./Build.sh -id 12345 -d YES -h localhost

目前,我正在这样做: ./Build.sh 12345 YES localhost

getopt,getopts 是我所追求的吗?如果是这样,你能告诉我如何在我的脚本中使用它吗?

到目前为止我的工作脚本:

if [[ $# != 3 ]]; then
   echo "Usage: ./Build.sh <CUSTID> <YES|NO> <HOST>" 2>&1
   exit 1
fi

# Checks for YES or NO option for Create.sql script
case $2 in
    YES|NO)
       filename="Build_$2.sql"
       ;;
    *)echo "Must enter YES or NO"
      exit 1
      ;;
esac

【问题讨论】:

标签: bash shell unix getopts


【解决方案1】:
#!/bin/bash

script="$0"
usage() {
  echo "Usage: $script <CUSTID> <YES|NO> <HOST>" 1>&2;
  exit 1;
}

while getopts ":i:d:h:" o; do
  case "${o}" in
    i)
      i=${OPTARG}
      ;;
    d)
      d=${OPTARG}
      if [[ "$d" != YES && "$d" != NO ]]; then
        usage
      fi
      ;;
    h)
      h=${OPTARG}
      ;;
    *)
      usage
      ;;
  esac
done
shift $((OPTIND-1))

if [[ -z "$i" || -z "$d" || -z "$h" ]]; then
  usage
fi

echo i: $i, d: $d, h: $h, rest: $@

但是,-h 按照惯例保留用于“帮助”;您可能希望也可能不希望更改它。

【讨论】:

  • 谢谢。这很好。您能否详细说明script="$0"shift $((OPTIND-1)) 以及它们的作用?
  • $0 是“第 0 个参数” - 您调用脚本时使用的名称。 ./../foo.sh bar 2 具有 ./../foo.sh$0,就像 bar 具有 $1 一样;我用它来打印使用情况而不对名称进行硬编码。 $OPTIND 是当前正在处理的选项的索引;当getopts 循环完成时,它将是第一个非选项参数的索引。 shift 然后从参数数组中删除所有选项参数。
  • 另一件事。我将如何执行我的 YES|NO 选项?我希望用户输入其中一个。谢谢。
  • 很好的例子。感谢您的帮助。
  • 另外,我如何强制使用不完整的条目?比如我用./Build.sh不带参数运行测试,但是用法没有显示出来。
【解决方案2】:

如果您使用长选项,即超过 1 个字符的选项,如果您使用getopts,则必须在其前面加上双破折号。但是,getopt 支持带有-a 的单破折号的长选项。你可以试试getopt -h查看详情,比如

 -a, --alternative            Allow long options starting with single -

此外,getopt 是一个独立程序,而getopts 是一个 bash 内置命令。我通常使用前者。

【讨论】:

    【解决方案3】:

    命令行操作的程序是传统的。他们从程序需要知道的命令行获取参数。除了参数之外,这些程序通常还采用命令行选项。

    复杂的程序可能不仅需要“参数”,还需要“选项”。

    例如:程序是否冗长。 ksh MyProgram -v trueksh MyProgram -v false

    命令行选项有多种形式。从历史上看,它们前面有一个破折号 - ,并且由一个字母组成。

    `-l -a -c`
    

    通常,这些单字符选项可以捆绑:

    `-lac`
    

    选项可以有值,值放在选项字符之后(如第一个例子所示或详细的真或假)

    `-s 24` OR  `-s24`
    

    由于这些选项非常神秘,因此开发了另一种使用长名称的样式。因此,可以使用更具描述性的 --long 来代替神秘的 -l 。为了区分一组单字符选项和一个长选项,在选项名称前使用两个破折号。长选项的早期实现使用加号 + 代替。此外,可以指定选项值,如

    --size=24 或者 --size 24

    + 表单现已过时并强烈弃用。

    关于long getOpts的非常详细的解释可以在http://perldoc.perl.org/Getopt/Long.html获得

    注意:注意事项。 getopts 非常聪明。用户必须意识到它的陷阱。虽然它是为了让参数处理更容易,但如果不小心使用它可能会出错。

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 2011-11-30
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多