尝试在 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
被忽略...
有什么方法可以处理完整的语法检查,并且可以在某种“沙盒模式”/“模拟模式”中运行脚本以捕获所有可能的错误,如果有错误则返回?
已编辑 如果脚本必须将脚本的某些部分复制到远程服务器中,例如在数百个从属服务器(受监控的服务器)上安装 nagios 的脚本等。不幸的是,文本复制并不总是顺利进行,错误可能是由将脚本自动复制为文本时发生错误,如果检测到任何错误,检查并结束脚本很重要。
你可以看看ShellCheck项目,它对 shell 脚本语法进行了更彻底的验证;包括最佳实践和潜在的陷阱。
但是,即使 ShellCheck 也不会将您问题中的示例报告为不正确,因为没有语法错误。
sleep5
您正在调用一个在语法上有效的外部命令。在调用它们之前使用变量并检查命令是否存在,如果不存在则优雅地失败。
正如@techraf 和@Wice22 指出的那样,在运行时没有完整的检查。
不过,您可以为您的 bash 脚本创建“单元”测试。一个有助于它的框架是 BATS:https
://github.com/sstephenson/bats 这些测试可以由 CI 系统在每次提交到你的 git repo 时运行,所以你会在这些脚本命中之前看看你是否搞砸了生产。
但是,使用 BATS,您的脚本没有自动测试,但您必须自己实现每个测试。
编辑:关于您的编辑:您可以创建要复制的脚本的 md5sum,将它们都复制(远程脚本和 md5sum 文件)并远程检查脚本是否仍然与 md5sum 匹配。
据我所知,bash 中没有“沙盒模式”这样的东西,没有 try/catch eater 要捕获 bash 中的错误,您需要运行脚本。试试这个线程https://stackoverflow.com/questions/22009364/is-there-a-try-catch-command-in-bash 您可以使用如图所示的子外壳来模拟救助,使用该技术您可能会如果检测到“异常”,可以在任何时候停止脚本,但这不是模拟。所以它会是这样的: