运行前完整的bash脚本检查

尝试在bash脚本test.sh执行自我语法检查以在脚本执行之前运行语法检查。

 error_exit() { echo -e "$1" 1>&2 exit 1 } bash -n "$(basename $BASH_SOURCE)" RESULT=$? if [ $RESULT == 0 ]; then echo "[OK] Test pass" else error_exit "Something is not right :( \n check the sytntax" fi starting-script 

bash -n ,和bash -x一样,如果有一些严重的语法错误,但是会出现如下小错误:

 echo "somthing" && sleep5&& ./test.sh: line 14: sleep5: command not found 

被忽略…

有什么办法来处理一个完整的语法检查,加上可能正在运行scrip在某种“沙箱模式”/“模拟模式”捕捉所有可能的错误,并返回错误,如果有的话?

编辑在脚本必须复制远程服务器的脚本的一部分的情况下,例如在数百个从站(受监视的服务器)上安装nagios的脚本等。不幸的是,文本复制并不总是顺利的,错误可以由在将脚本自动复制为文本时发生错误,检查并结束脚本(如果检测到任何错误)非常重要。

正如@techraf和@Wice22所指出的那样,在运行时没有完整的检查。

你可以为你的bash脚本创build“单元”testing。 一个有助于它的框架是BATS: https : //github.com/sstephenson/bats
这些testing可以由CI系统在每次提交到你的git仓库时运行,所以你会看到在这些脚本生产之前你是否搞砸了。

但是,BATS不会自动testing您的脚本,但是您必须自行实施每个testing。

编辑:关于你的编辑:你可以创build一个md5sum将被复制的脚本,将它们都复制(远程脚本和md5sum文件),并远程检查脚本是否仍然匹配md5sum。

您可能会看一下ShellCheck项目,该项目对shell脚本语法进行了更全面的validation; 包括最佳做法和潜在的陷阱。

然而,即使ShellCheck也不会将您的问题的例子报告为不正确的,因为没有语法错误。

您正在调用外部命令sleep5 ,这是一个语法上有效的操作。

在调用它们之前,使用variables并检查命令是否存在,如果不存在则优雅地失败。

没有这样的事情在bash中的“沙箱模式”,据我所知,没有尝试/赶上食客要赶上bash中的错误,你需要运行脚本。 试试这个线程https://stackoverflow.com/questions/22009364/is-there-a-try-catch-command-in-bash你可以通过使用如下所示的子shell来模拟救援,使用这种技术,你可能会能够在任何点停止脚本,如果检测到“exception”,但这不是一个模拟。 所以它会是这样的:

 #!/bin/bash script_name=$(basename $0) error_exit() { echo -e "${script_name} file: ${1:-"Unknown Error"}" 1>&2 exit 1 } bash -n "$(basename $BASH_SOURCE)" RESULT=$? if [ $RESULT == 0 ]; then echo $" ${green}[OK] Test pass${reset} " else error_exit "syntax error detected" fi echo "Check pass ok" bash -e <<TRY echo "" && sleep5 echo"and_somthing else" echo"and_some_more stuff" echo"and some_more" TRY if [ $? -ne 0 ]; then error_exit "error detected" fi echo "continuing if all goes well"