当我像这样运行命令时:$: ./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
的回声。如果你想允许更自由的语法,在文件名后面加上选项(比如GNU
rm
),你需要自己做一些参数解析把你的循环放到另一个循环中。当getopts
循环完成时,您可以执行以下操作:# Find next option argument
while [[ $OPTIND <= $# && ${!OPTIND} != -* ]]; do
((OPTIND++))
done
# Stop when we've run out of arguments
if [[ $OPTIND > $# ]]; then
break
fi