在bash中使用getopts解析args的错误

时间:2014-05-10 13:03:59

标签: bash getopts

我试图修改bd脚本以使用getopts。我是bash脚本的新手

我的脚本是

while getopts ":hvis:d:" opt
do
...
done

...

echo $somedirpath
cd "$somedirpath"    

在执行

时运行正常
$ ./bd -v -i -s search

$ ./bd -is search -d dir

但是当像这样运行时

$ . ./bd -s search

getopts根本不读取参数。我根据参数在while循环中设置的所有变量都没有设置,因此脚本不再有效。请帮忙!

2 个答案:

答案 0 :(得分:6)

当您获取脚本时,getopts解析的参数是当前shell的参数,而不是source命令行中的参数。

常见的解决方法是让脚本只打印路径,然后像cd "$(bd)"那样调用它(可能通过函数或别名间接调用)。

答案 1 :(得分:6)

在调用OPTIND=1之前设置getopts可以正常工作。

问题在于getopts依赖于OPTIND来循环提供的参数,并且在获取脚本之后,根据getopts将其设置为大于1的某个值。你传递了多少个论点。即使脚本结束(因为它的来源),该值也会被转移。因此,下次其来源getopts将从OPTIND获取,而不是从1开始!

这可能会导致其他脚本的奇怪行为,我不知道这是多么安全。但它有效!

为了更好的解决方法,我认为@tripleee建议看起来安全可靠。