2010-03-21 82 views
0

当我使用'while getopts d:n:OPTION'时 - 我如何知道我只有无效的选项,如果是,那么它后面有一个参数?getopts in bash programming

回答

4

你知道你有一个无效的选项,因为返回值是'?'。

或者:

  • 你不能告诉它是否发生了争执,因为该选项是无效的。

或者:

  • 你要看看接下来的参数,看它是否以短划线开头。

'或'选项中的启发式是不完美的。随着期权捆绑,我可以这样写:

command -xbf/fidget 
  1. 如果getopts的选项字符串为'xf:',那么,“B”是无效的选项。
  2. 如果getopts选项字符串是'xbf:',那么在有效选项'b'后面会出现选项'f'和选项参数'/ fidget'。
  3. 如果getopts选项字符串是'xb:f:',那么'b'的选项参数将是'f/fidget'。

我认为这种“任一”的态度是正确的 - 你不能说。从所谓的“rcsunco”命令


代码片段 - 取消RCS检出(和在写的时候我被勉强动过SCCS):

remove=yes 
keep=no 
get=no 
quiet= 

while getopts gknqrV opt 
do 
     case $opt in 
     V) echo "`basename $0 .sh`: RCSUNCO Version $Revision: 2.1 $ ($Date: 2002/08/03 07:41:00 $)" | 
      rcsmunger 
      exit 0;; 
     g) get=yes;; 
     k) keep=yes;; 
     n) remove=no;; 
     q) quiet=-q;; 
     r) remove=yes;; 
     *) echo "Usage: `basename $0 .sh` [-{n|g}][-{r|k}] file [...]" 1>&2 
      exit 1;; 
     esac 
done 

shift $(($OPTIND-1)) 

这些天,我已经采用“平衡的括号”中的“情况”符号:

 (q) quiet=-q;; 

另外请注意,我没有明确测试返回哪个选项 - 我让包罗万象“*”的情况下成交。我还观察到使用信息不完整(没有'-V'或'-q'记录),并且代码已经足够老,所以我没有添加'-h'帮助选项。脚本'rcsmunger'用'2.1'代替'$Revision 2.1 $',更像是SCCS用'2.1'替换'%I%'的方式。

+0

oh..i看..非常感谢你的帮助 – sagi 2010-03-21 16:28:05

0

的选项无效会有一个问号?...的命令行参数处理停止,如果有一个问号IIRC处理...