我试图修改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
循环中设置的所有变量都没有设置,因此脚本不再有效。请帮忙!
答案 0 :(得分:6)
当您获取脚本时,getopts
解析的参数是当前shell的参数,而不是source
命令行中的参数。
常见的解决方法是让脚本只打印路径,然后像cd "$(bd)"
那样调用它(可能通过函数或别名间接调用)。
答案 1 :(得分:6)
在调用OPTIND=1
之前设置getopts
可以正常工作。
问题在于getopts
依赖于OPTIND
来循环提供的参数,并且在获取脚本之后,根据getopts
将其设置为大于1的某个值。你传递了多少个论点。即使脚本结束(因为它的来源),该值也会被转移。因此,下次其来源getopts
将从OPTIND
获取,而不是从1开始!
这可能会导致其他脚本的奇怪行为,我不知道这是多么安全。但它有效!
为了更好的解决方法,我认为@tripleee建议看起来安全可靠。