【问题标题】:Improve argument validation改进参数验证
【发布时间】:2010-12-03 10:18:53
【问题描述】:

我创建了一个 Bash 脚本,并且我有一些相当丑陋的参数验证。我知道 getopt 和 getopts ,但认为它们是矫枉过正的。这就是我想要的用法:

Usage:  flipfile [OPTION] inputfile outputfile


Options:
-f  Force. Accept ANY inputfile, not just regular files.

而我目前的验证码是:

if [ $# -eq 2 ]; then
        infile=$1
        outfile=$2
elif [ $# -eq 3 -a $1 = "-f" ]; then
        option=$1
        infile=$2
        outfile=$3
else
        echo -e "Error. Usage:  flipfile [OPTION] inputfile outputfile\n\n"
        echo -e "Options:\n-f\tForce. Accept ANY inputfile, not just regular files."
        exit 1
fi

验证有效。但由于我这样做是为了乐趣和学习体验,我很感激任何可以帮助我编写更清晰的 Bash 脚本的技巧。

您将如何改进此验证代码?如果您认为这是正确的决定,请使用 getopt 或 getopts。我希望可选的 -f 作为第一个参数。如果您认为[[ conditional-expression ]] 比我所拥有的更干净,也可以随意更改。我会接受我认为最干净的答案。

【问题讨论】:

    标签: bash


    【解决方案1】:

    这是一个不错的起始模板 - 易于扩展到其他选项,并且易于为不同数量的参数提供不同的可能性。

    #!/bin/bash
    
    exit_usage() {
        echo -e "Usage: flipfile [option] inputfile outputfile"
        exit 1
    }
    
    while getopts "f" opt; do
        case $opt in 
            f ) force=1;;
            * ) exit_usage;;
        esac
    done
    shift $((OPTIND-1))
    
    case $# in
        2 ) infile=$1
            outfile=$2;;
        * ) exit_usage;;
    esac
    
    <actual script>
    

    【讨论】:

    • 为什么不将echo -e 替换为cat &lt;&lt;USAGE ENDS ...?这样更清楚。
    • 我刚刚复制了他的回声。重点是结构 - getopt 的 while/case 循环、参数数量的 case 和使用函数。
    • 好吧,当一个人要求改进并发布他的工作(!)代码时,我认为他应该得到很多改进。 :) +1,顺便说一句。
    • @Pavel Shved:你在做志愿者吗?
    • 就我个人而言,我倾向于定义一些变量,以便我可以根据用户似乎需要多少帮助(也许提供'-h'选项)至少有两个使用语句,所以打印看起来像echo [-n] "$USAGE_&lt;type&gt;"
    【解决方案2】:

    我认为 Jefromi 的 回答非常好。即使它消除了您所有的 if 陈述,我也会评论您的问题中提到它们的部分。

    在 Bash 中,双括号允许更简洁的语法,看起来更像其他一些语言。您可以避免转义括号和大多数引用。比较运算符更简单。有一些可用的运算符[ 不提供,例如通配符样式的模式匹配和正则表达式匹配。它使用&amp;&amp;|| 表示“and”和“or”,使用! 表示“not”。将它用于字符串和文件。

    这是一个疯狂的例子,说明了许多可用的多功能性:

    if [[ ( $v1 > 42 && $v2 == $v3 ) || ( $v4 != $(cmnd $(mk-arg-cmnd)) && v5 =~ ^-?[[:digit:]]+$ ]]
    

    如果要比较数字,请使用双括号:

    if (( $i >= $number + $other ))
    

    更多信息请参见this page

    【讨论】:

      猜你喜欢
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多