0

我有一台新的 RHEL6 机器,我正在尝试运行一个脚本来生成一些输出。该脚本使用我过去从未使用过的 getopts。这应该可以在其他机器上使用,但这是我第一次尝试。下面是脚本的开头。语法有什么问题吗?当我尝试输出变量时,它什么也不显示:

#! /bin/sh

while getopts "h:u:g:o:e:y:bf" c
 do
     case "$c" in
       u)         USER=$OPTARG;;
       g)         GROUP=$OPTARG;;
       o)         OUT=$OPTARG;;
       b)         BATCH=1;;
       f)         FORCE=1;;
       h)         FQDN=$OPTARG;;
       e)         ENTITYID=$OPTARG;;
       y)         YEARS=$OPTARG;;
       \?)        echo "keygen [-o output directory (default .)] [-u username to own keypair] [-g owning groupname] [-h hostname for cert] [-y years to issue cert] [-e entityID to embed in cert]"
                  exit 1;;
     esac
 done
echo $FQDN

回显显示一个空行。

4

1 回答 1

1

您不能在 bash 中使用问号getopts(也不能使用冒号)。在问号的情况下,当遇到选项结束时getopts,将参数的值($c在您的情况下)设置为问号。当出现错误时,它还使用问号和冒号作为参数名称的值(具体而言,当遇到无效选项或处于非静默模式且未提供必需选项时使用 ?;静默时使用冒号未提供所需选项时的模式)。在这些错误情况下,OPTARG 包含有问题的参数。这也是 POSIX getopts 的工作原理。

KSH getopts 的行为不同,但它也排除? :(以及- [ ]并且仅允许#作为第一个选项)。但是,当您提供-?. 基本上,不要使用 -? 使用外壳 getopts。:)

通常,我编写一个名为“usage”的小函数并从两者中调用它,*)并在 case 语句之后立即检查$?非零值。

于 2014-02-19T19:53:36.833 回答