如何使用getopt / getopts

时间:2015-05-22 03:35:31

标签: bash shell unix 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 $2 in
    YES|NO)
       filename="Build_$2.sql"
       ;;
    *)echo "Must enter YES or NO"
      exit 1
      ;;
esac

3 个答案:

答案 0 :(得分:3)

#!/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按惯例保留用于“帮助”;你可能希望也可能不希望改变它。

答案 1 :(得分:0)

如果使用长选项,即超过1个字符的选项,如果使用getopts,则必须在其前加上双击。但是,getopt支持使用-a的单个短划线的长选项。您可以尝试getopt -h查看详细信息,例如

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

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

答案 2 :(得分:0)

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

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

例如:程序是否详细。 ksh MyProgram -v trueksh MyProgram -v false

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

`-l -a -c`

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

`-lac`

选项可以有值,值放在选项字符后面(如第一个例子中所示,或者是详细的true或false)

`-s 24` OR  `-s24`

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

--size=24 要么     --size 24

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

有关长getOpts的详细说明,请访问http://perldoc.perl.org/Getopt/Long.html

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