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