我有一台新的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

回声显示空行。

最佳答案

不能对bash使用问号(也不能使用冒号)。对于问号,getopts在遇到选项结尾时将参数的值(getopts在您的情况下)设置为问号。当出现错误时,它还使用问号和冒号作为参数名的值(特别是?在遇到无效选项或处于非静默模式且未提供必需选项时使用;在静默模式下未提供必需选项时使用冒号)。在这些错误情况下,OPTARG包含有问题的参数。这就是POSIX getopts的工作原理。
KSH getopts的行为不同,但它也排除了$c(以及? :并且只允许- [ ]作为第一个选项)。但是,当您提供#时,它确实会显示一条用法消息。基本上,不要用-?带着贝壳。:)
通常,我编写一个名为“usage”的小函数,从-?调用它,并在case语句之后立即检查*)是否为非零值。

关于linux - RHEL6 getopts似乎不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21886160/

10-11 21:18