【发布时间】:2018-05-09 00:35:06
【问题描述】:
一旦在处理getops 中的选项时执行了bash 程序,循环就会退出。
作为一个简短的例子,我有以下 bash 脚本:
#!/usr/bin/env bash
while getopts ":a:l:" opt; do
case ${opt} in
a)
ls -a $2
;;
l)
ls -l $2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument" >&2
exit 1
;;
esac
done
echo -e "\nTerminated"
如果脚本名为test.sh,当我使用此命令执行脚本时,我会得到以下输出,其中仅处理-a 标志,而忽略-l:
$ ./test.sh -al .
. .. file1.txt file2.txt test.sh
Terminated
但是,如果我删除每个参数后的冒号,表明每个参数不需要操作数,那么脚本会按预期执行。如果while循环改为:
while getopts ":al" opt; do
然后,运行我的脚本会得到以下输出(-a 和 -l 都已处理):
$ ./test.sh -al .
. .. file1.txt file2.txt test.sh
total 161
-rwxrwxrwx 1 root root 0 Nov 24 22:31 file1.txt
-rwxrwxrwx 1 root root 0 Nov 24 22:32 file2.txt
-rwxrwxrwx 1 root root 318 Nov 24 22:36 test.sh
Terminated
此外,在我的循环末尾添加类似OPTIND=1 的内容只会导致执行第一个参数的脚本无限循环。
我怎样才能让getopts 解析带有选项参数的多个参数(每个参数后有:)?
【问题讨论】:
-
getopts是正确的。你声明了选项a来接受一个论点;当你说-algetopt看到选项a和参数l。 -
你不应该直接访问
$2,你破坏了使用getopts的对象。-a的参数在$OPTARG中,应遵循-a或-l。 -
考虑不使用“静默模式”(省略
:a:l:中的前导冒号),这样您就可以看到getopts认为出了什么问题,如果有的话。仅当您确信您的代码正常工作时才使用前导冒号。一般来说,请确保计算机尽快告诉您错误。