getopts 没有提供参数

Posted

技术标签:

【中文标题】getopts 没有提供参数【英文标题】:getopts no argument provided 【发布时间】:2013-05-03 11:55:54 【问题描述】:

如何检查是否没有提供必需的参数?我发现 switch case 中的 ":" 选项应该足以达到这个目的,但它永远不会进入那个 case(代码块)。我是否将“冒号”放在开头或其他地方都没有关系。

我的代码:

while getopts :a:b: OPTION;
do
     case "$OPTION" in
         a)
             var1=$OPTARG
             ;;
         b)
             var2=$OPTARG
             ;;
         ?)
             exitScript "`echo "Invalid option $OPTARG"`" "5"
             ;;
         :)
             exitScript "`echo "Option -$OPTARG requires an argument."`" "5"
             ;;
         *)
             exitScript "`echo "Option $OPTARG unrecognized."`" "5"
             ;;
     esac
done

提前 THX。

【问题讨论】:

首先,尽量提供最小的工作示例:你的不是因为exitScript函数。 【参考方案1】:

case 块中的?) 应写为"?")

【讨论】:

+1 澄清一下,case 选择器中未加引号的 ? 是一个全局模式,它匹配任何单个字符 - : 的值在此处被截获,并且永远不会到达条款意味着它。【参考方案2】:

您必须转义?。下一个罐头(部分)有效。

err()  1>&2 echo "$0: error $@"; return 1; 
while getopts ":a:b:" opt;
do
        case $opt in
                a) aarg="$OPTARG" ;;
                b) barg="$OPTARG" ;;
                :) err "Option -$OPTARG requires an argument." || exit 1 ;;
                \?) err "Invalid option: -$OPTARG" || exit 1 ;;
        esac
done

shift $((OPTIND-1))
echo "arg for a :$aarg:"
echo "arg for b :$barg:"
echo "unused parameters:$@:"

部分是因为什么时候会调用上面的脚本

$ bash script -a a_arg -b b_arg extra

会如你所愿,

arg for a :a_arg:
arg for b :b_arg:
unused parameters:extra:

但是当你将它称为

bash script -a -b b_arg

将打印

arg for a :-b:
arg for b ::
unused parameters:b_arg:

什么不是,你想要什么。

还有UUOE。 (不能使用回声)。

【讨论】:

以上是关于getopts 没有提供参数的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本参数解析之 getopt getopts

Linux getopt/getopts解析命令行参数教程

在 Perl 中使用 Getopt 时如何对参数进行分组?

getopt-解析命令行参数

getopt()和getopt_long函数

Python 命令行参数和getopt模块详解