我编写了一个Bash安装脚本,以帮助人们安装我为一款名为Minetest的游戏制作的mod。脚本成功执行并将当前文件夹复制到.../minetest_game/mods
。
但是,我已经设置了另一个选项,允许用户通过运行./install.sh other_subgame
来更改安装mod的子游戏(文件夹)。这成功运行并将mod安装在正确的文件夹中。但是,我没有退出脚本的末尾,而是回到了之前的一个名为subStall
的函数。请注意,当我只运行./install
时,这不会发生。
当最后再次运行substall
函数时,用户可以使用Ctrl+C
并退出,但它仍然令人烦恼并且可能会使某些用户感到困惑。
有什么想法吗?如果您想查看我的完整脚本,可以查看它here。谢谢!
答案 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语句链接到它。
感谢您的帮助。如果我没有说清楚的话,请告诉我。我还不习惯这个东西。