Bash脚本循环而不是退出

时间:2016-04-14 01:25:31

标签: bash scripting

我编写了一个Bash安装脚本,以帮助人们安装我为一款名为Minetest的游戏制作的mod。脚本成功执行并将当前文件夹复制到.../minetest_game/mods

但是,我已经设置了另一个选项,允许用户通过运行./install.sh other_subgame来更改安装mod的子游戏(文件夹)。这成功运行并将mod安装在正确的文件夹中。但是,我没有退出脚本的末尾,而是回到了之前的一个名为subStall的函数。请注意,当我只运行./install时,这不会发生。

当最后再次运行substall函数时,用户可以使用Ctrl+C并退出,但它仍然令人烦恼并且可能会使某些用户感到困惑。

有什么想法吗?如果您想查看我的完整脚本,可以查看它here。谢谢!

2 个答案:

答案 0 :(得分:2)

首先关闭调试建议。如果您不知道脚本正在做什么,请为其添加set -x。然后shell将打印出运行它之前运行的每个命令。 (还有其他一些你可以做的事情和更精确的调试方法,但这是一个很好的第一步。)这样做可能会让你按照程序的流程来看看发生了什么。

其次,请尝试在帖子 MCVE中包含以解决您的问题(或者至少包含一个pastebin或gist或其他git repo)。让人们下载文件通常是不受欢迎的,并且人们实际上不太可能花时间研究你的问题。

那说你不需要这样做来跟踪流程并看看发生了什么(假设我正确地遵循了它)。

问题是,在145行,您检查是否已将$subgame传递给脚本,如果已经过,则立即致电midCheck(行149 }和midCheck最终调用install)。之后,您继续使用subStall函数,最终点击162再次调用midCheck

我认为你所看到的是什么。修复此问题(通过仅在midCheck语句中调用if后退出或仅通过检查$subgame和运行行152-159,只有在未设置然后midCheck时退出只能在一个地方调用if来解决问题。

作为补充评论。避免在多个地方(针对各种->add('category', TextType::class) 条件)调用相同的函数可能是一个好主意。您可能还希望通过http://www.shellcheck.net/运行脚本以查看它捕获的常见问题(例如未使用的变量等)。

答案 1 :(得分:0)

我能够通过调整我的if语句来解决这个问题,这样在找到之前没有给出任何输入时,它会运行一个名为null=""的新函数,而不是设置subQuery。这解决了我的问题,现在脚本运行正常。

从我的基本理解,我认为为了简化事情,有一个if语句然后什么都不做,是个坏主意。如果你需要if语句在收到某些数据时继续,但是如果接收到其他数据则需要其它内容,不要基本上将then语句留空。创建一个存储脚本下一部分的函数,并通过if语句链接到它。

感谢您的帮助。如果我没有说清楚的话,请告诉我。我还不习惯这个东西。