一个 stackoverflow 帖子有一个用于处理命令行参数的模板。
该测试是否[ $# == 0 ]
意味着 bash 脚本不应在没有任何参数的情况下运行?作为模板,我认为脚本通常不一定需要任何参数。
在case
声明中,这两种情况有什么不同*)
?"?")
他们看起来是一样的。
# --- Options processing -------------------------------------------
if [ $# == 0 ] ; then
echo $USAGE
exit 1;
fi
while getopts ":i:vh" optname
do
case "$optname" in
"v")
echo "Version $VERSION"
exit 0;
;;
"i")
echo "-i argument: $OPTARG"
;;
"h")
echo $USAGE
exit 0;
;;
"?")
echo "Unknown option $OPTARG"
exit 0;
;;
":")
echo "No argument value for option $OPTARG"
exit 0;
;;
*)
echo "Unknown error while processing options"
exit 0;
;;
esac
done
shift $(($OPTIND - 1))
param1=$1
param2=$2
答案1
该脚本至少需要一个参数,如果没有,它会显示使用信息。它应该echo $USAGE >&2
这样做,因为这是一个错误。其他脚本可能使用零参数,因此您必须进行修改。就像有些人不接受这种争论一样i
。
“?”,与 *
是的,它们是不同的:
"?"
说要找一个?
。这是 getopts 在找到不期望的选项(无效选项)时返回的结果。*
对案例说,如果您找不到其他匹配项,则执行此操作。这不应该发生,但也有可能发生。它可能表明 getopts 中存在错误,或更可能是您的程序存在错误(请参阅防御性编程)。
答案2
它们应该是相同的。
然而,该代码也有其自身的问题:
- 未能引用算术扩展;应该
shift "$(($OPTIND - 1))"
==
不可移植运算符的使用- 写入标准输出的错误消息
- 如果出现错误,则以 0(成功)状态退出
- 未能引用变量;应该是
"$#"
并且echo "$USAGE"
- if-no-arguments 检查放置不当;它应该是后getopts 循环,以免被愚弄
script --
- 无用的引用
v
、h
和i
:i:vh