刚开始使用getopts,发现一个问题...
例如 - 有一个脚本:
while getopts "h:loav" opt; do
case $opt in
h)
h=$OPTARG
echo $h
;;
但是当我运行它时:
$ ./ftpclean.sh -h -l
-l
我将第二个选项作为第一个选项的参数...所以 - 如果用户忘记设置参数:
$ ./ftpclean.sh -h argument
argument
getopts
将设置echo *second option*
...
有什么“合法”的方法可以避免吗?
我发现的最佳解决方案是添加功能:
function checkargs () {
if [[ $OPTARG =~ ^-[a/l/o/a/v]$ ]]
then
echo "OPTERR"
exit 1
fi
}
并在设置变量之前运行它:
while getopts "h:loav" opt; do
case $opt in
h)
checkargs
h=$OPTARG
echo $h
;;
所以现在:
$ ./ftpclean.sh -h -l
OPTERR
答案1
getopts h:
表示该选项-h
需要一个参数。选项的参数可以与选项本身在同一个单词中,或者如果下一个单词中没有任何内容。指定空参数的唯一方法是在选项后传递一个空字。
当你写的时候./ftpclean.sh -h -l
,-l
是选项的参数-h
。你也可以写./ftpclean.sh -h-l
。如果您想将空参数传递给-h
,请编写./ftpclean.sh -h '' -l
。
看来您想违反 Unix 参数约定并要求参数与命令位于同一个单词中。如果你想这样做(我强烈建议不要这么做,因为你会让用户感到困惑,让他们咒骂你做了一些没有道理的不标准的事情),对getopts
你没有多大帮助,你最好做你的自己解析。