我有一个bash脚本,我用它从我目前的任何地方从源目录移动到bin目录(我称之为脚本,'teleport').因为它基本上只是一个美化的'cd'命令,所以我必须在当前的shell(即./teport.sh)中运行它.我在.bashrc文件中设置了一个别名,以便'teleport'匹配'.teleport.sh".
我第一次运行它,它工作正常.但是,如果我在运行一次之后再次运行它,它什么都不做.如果我关闭终端然后打开一个新终端,它会再次起作用,但这只是第一次.我的直觉是,有内部发生的事情与BASH是我不熟悉的东西,所以我想我会运行它通过这里的大师们,看看我是否能得到答案.
该脚本是:
numargs=$#
function printUsage
{
echo -e "Usage: $0 [-o | -s] <PROJECT>\n"
echo -e "\tMagically teleports you into the main source directory of a project.\n"
echo -e "\t PROJECT: The current project you wish to teleport into."
echo -e "\t -o: Teleport into the objdir.\n"
echo -e "\t -s: Teleport into the source dir.\n"
}
if [ $numargs -lt 2 ]
then
printUsage
fi
function teleportToObj
{
OBJDIR=${HOME}/Source/${PROJECT}/obj
cd ${OBJDIR}
}
function teleportToSrc
{
cd ${HOME}/Source/${PROJECT}/src
}
while getopts "o:s:" opt
do
case $opt in
o)
PROJECT=$OPTARG
teleportToObj
;;
s)
PROJECT=$OPTARG
teleportToSrc
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
我对它的用法如下:
sjohnson@corellia:~$ cd /usr/local/src
sjohnson@corellia:/usr/local/src$ . ./teleport -s some-proj
sjohnson@corellia:~/Source/some-proj/src$ teleport -o some-proj
sjohnson@corellia:~/Source/some-proj/src$
<... START NEW TERMINAL ...>
sjohnson@corellia:~$ . ./teleport -o some-proj
sjohnson@corellia:~/Source/some-proj/obj$
Run Code Online (Sandbox Code Playgroud)
问题是getopts必须保持一点状态,以便可以在循环中调用它,并且您不会清除该状态.每次调用它时,它会再处理一个参数,并递增shell的OPTIND变量,以便它知道下次调用时要处理的参数.当它完成所有参数时,每次调用它都会返回1(false),从而while退出.
第一次使用脚本时,它按预期工作.第二个(以及第三个,第四个......)时间,getopts只会返回错误.
在开始循环之前添加一行以重置状态:
unset OPTIND # clear state so getopts will start over
while getopts "o:s:" opt
do
# ...
done
Run Code Online (Sandbox Code Playgroud)
(我假设你的成绩单中有一个拼写错误,因为它显示你在第二次尝试时调用脚本 - 而不是采购它 - 但这不是真正的问题.)
| 归档时间: |
|
| 查看次数: |
614 次 |
| 最近记录: |