如何使用 getopt/getopts

how to use getopt/getopts

所以,我学会了如何在我的 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  in
    YES|NO)
       filename="Build_.sql"
       ;;
    *)echo "Must enter YES or NO"
      exit 1
      ;;
esac
#!/bin/bash

script="[=10=]"
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 按照约定保留给 "help";您可能希望也可能不想更改它。

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

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

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

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

复杂的程序可能不仅需要 'Arguments',还需要 'Options'。

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

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

`-l -a -c`

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

`-lac`

选项可以有值,值放在选项字符之后(如第一个例子所示或冗长的true或false)

`-s 24` OR  `-s24`

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

--size=24 要么 --size 24

+ 表单现已过时,强烈反对。

http://perldoc.perl.org/Getopt/Long.html

提供了关于 long getOpts 的非常详细的解释

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