当我像这样运行命令时:
$: ./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

最佳答案

这和斜杠没有关系。getopts在到达第一个不以-开头的参数时停止处理选项。这是documented行为:
当遇到选项结束时,getopts退出,返回值大于零。OPTIND设置为第一个非选项参数的索引,name设置为?
你声称当你使用

./script f1 f2 -r

完全是错误的。我在脚本的末尾添加了echo $RECURSIVE_FLAG,当我运行它时,它会发出0的回声。
如果你想允许更自由的语法,在文件名后面加上选项(比如GNUrm),你需要自己做一些参数解析把你的循环放到另一个循环中。当getopts循环完成时,您可以执行以下操作:
# Find next option argument
while [[ $OPTIND <= $# && ${!OPTIND} != -* ]]; do
    ((OPTIND++))
done
# Stop when we've run out of arguments
if [[ $OPTIND > $# ]]; then
    break
fi

10-08 08:10