改进参数验证

时间:2009-10-02 18:46:55

标签: bash

我已经创建了一个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 ]]比我的更清洁,请随意改变它。我会接受我认为最干净的答案。

2 个答案:

答案 0 :(得分:2)

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

#!/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>

答案 1 :(得分:0)

我认为 Jefromi的答案非常好。即使它删除了您的所有if语句,我也会对您提出的问题进行评论。

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

这是一个疯狂的例子,展示了一系列可用的多功能性:

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

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

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

有关详细信息,请参阅this page