当我运行这样的命令时:
$: ./script -r f1 f2
:
它检测到“ -r”标志并将递归标志设置为1。
$: ./script directory/ -r
:
getopts
根本没有检测到-r
标志。因此,在case语句中,它永远不会检测到-r
标志,因此while循环甚至根本不会运行。如何解决?
RECURSIVE_FLAG=0
while getopts ":rR" opt ; do
echo " opt = $opt"
set -x
case "$opt" in
r) RECURSIVE_FLAG=1 ;;
R) RECURSIVE_FLAG=1 ;;
:)echo "not working" ;;
*)echo "Testing *" ;;
esac
done
答案 0 :(得分:1)
与斜杠无关。当getopts
到达不以-
开头的第一个参数时,它将停止处理选项。这是documented的行为:
遇到选项结尾时,
getopts
退出,返回值大于零。OPTIND
设置为第一个非选项参数的索引,而 name 设置为?
。
您声称使用后可以使用
./script f1 f2 -r
完全是错误的。我在脚本的末尾添加了echo $RECURSIVE_FLAG
,并且以这种方式运行时它回显了0
。
如果要允许使用更自由的语法,请在文件名后加上选项(例如GNU rm
),则需要自己进行一些参数解析。将您的getopts
循环放入另一个循环中。 getopts
循环结束后,您可以执行以下操作:
# Find next option argument
while [[ $OPTIND <= $# && ${!OPTIND} != -* ]]; do
((OPTIND++))
done
# Stop when we've run out of arguments
if [[ $OPTIND > $# ]]; then
break
fi