我们开始了一系列关于shell脚本调试的文章,首先解释了不同的调试选项,下面介绍如何启用shell调试模式。编写脚本后,建议在运行脚本之前检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工作。在本系列的这一部分,我们将看到如何使用语法检查调试模式。记得我们在本系列的***部分前面解释了不同的调试选项,这里我们将使用它们来执行脚本调试。启用详细调试模式在进入本教程的内容之前,让我们简要地探索一下详细模式。它可以通过-v调试选项启用,它告诉shell在读取时显示每一行。为了展示这是如何工作的,下面是一个示例脚本,用于将PNG图像批量转换为JPG格式。将以下内容键入(或复制并粘贴)到文件中。#!/bin/bash#convertforimagein*.png;doconvert"$image""${image%.png}.jpg"echo"image$imageconvertedto${image%.png}.jpg"doneexit0然后保存文件,使用以下使脚本可执行的命令:$chmod+xscript.sh我们可以执行脚本并显示shell读取的每一行:$bash-vscript.sh显示shell脚本中的所有行Enablesyntaxcheckingdebugginginshell脚本模式回到我们主题的重点,-n激活语法检查模式。它使shell读取所有命令,但它(shell)不执行它们,而只是检查语法。一旦发现shell脚本有错误,shell就会在终端输出错误,否则什么都不显示。激活语法检查的命令如下:$bash-nscript.sh由于脚本中的语法是正确的,所以上面的命令不会显示任何内容。那么,让我们尝试删除结束for循环的done,看看它是否显示错误:这是一个修改后的脚本,可以将png图像批量转换为jpg格式,但存在错误。#!/bin/bash#scriptwithabug#convertforimagein*.png;doconvert"$image""${image%.png}.jpg"echo"image$imageconvertedto${image%.png}.jpg"exit0保存文件,然后运行脚本并执行语法检查:$bash-nscript.sh检查shell脚本语法从上面的输出中,我们看到我们的脚本中有一个错误,for循环缺少关闭的done关键字。shell脚本从头到尾检查文件,一旦没有找到(完成),shell打印语法错误:script.sh:line11:syntaxerror:unexpectedendofffile我们可以同时结合详细模式和语法检查模式:$bash-vnscript.sh在脚本中同时启用详细检查和语法检查另外,我们可以通过修改脚本的第一行来启用脚本检查,如下例:#!/bin/bash-n#alteringthefirstlineofascripttoenablesyntaxchecking#convertforimagein*.png;doconvert"$image""${image%.png}.jpg"echo"image$imageconvertedto${image%.png}.jpg"exit0如上图,保存文件,检查语法fly:$./script.shscript.sh:line12:syntaxerror:unexpectedendofffile另外,我们可以使用内置的set命令在脚本中启用调试模式。在下面的示例中,我们只检查脚本中的for循环语法。#!/bin/bash#usingsetshellbuilt-incommandtoenableddebugging#convert#enabledset-nforimagein*.png;doconvert"$image""${image%.png}.jpg"echo"image$imageconvertedto${image%.png}.jpg"#disabledebuggingset+nexit0保存并再次执行脚本:$./script.sh一般来说,我们应该确保在执行shell脚本之前检查脚本语法以捕获错误。请在下面的反馈框中向我们发送有关本指南的任何问题或反馈。在本系列的第三部分中,我们将解释和使用shell跟踪调试模式。关于作者:AaronKili是Linux和F.O.S.S爱好者,即将成为Linux系统管理员、Web开发人员和当前的TecMint内容创建者,他喜欢使用计算机并分享他的知识。
