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