如果您遇到建筑物,测试或运行复杂的Bash脚本,请不要丢失心脏。您有很多方法可以帮助确保您的脚本完美无瑕。在这篇文章中,我们将研究某种方式,您可以减少错误的可能性以及如何执行一些简单但非常有效的故障排除。
通过强大的逻辑组合来测试可能的问题和一些故障排除来帮助检测错误,您的脚本可能会尽快迅速地显示。
首先建造外边缘
避免脚本中的语法错误的一种方法是使用外部逻辑启动您的循环,循环,案例语句和if /然后命令。如果您使用句法“骨架”启动脚本逻辑,则不会忘记正确结束。
为了一世在列表尽管 [状况]案例“1美元”如果[状况];然后做str1.)cmd ;;CMDS.CMDS.CMDS.*)cmd ;;别的
完成了eSAC.CMDS.
FI.
在将基本命令框架到位后返回并填写详细信息。
验证脚本参数
为了帮助确保脚本无法进入运行时问题,请确保它检查正在提供正确数量的参数,并且提供的任何文件作为参数实际存在。以下是实现这些检查的一些示例。
检查参数#
如果[$#-lt 2];然后回显“用法:$ 0行文件名”退出else numlines = $ 1 filename = $ 2 fi
请注意,如果参数不匹配预期的内容,则生成使用语句,然后退出脚本。
检查参数的类型
如果[$ numlines!= [0-9] *]];然后回显“错误:$ numlines不是数字”退出fi
检查文件是否存在
如果 [ !-f $ filename];然后回显“错误:找不到文件$ filename”退出fi
打开Bash调试
另一种测试脚本它打开调试的方法。这将有助于您验证它们是否正常工作或查明可能导致问题的脚本中的任何行。您可以使用符合通常称为“调试模式”的原因-X作为bash的争论。它可以通过在执行脚本中显示每个行来帮助调试。这允许您查看哪些命令按预期工作,哪些命令不是。
您可以使用-X用两种方式之一。您可以像这样启动脚本:
$ bash -x myscript
或者你可以插入-X进入脚本顶部的“谢信线”:
#!/ bin / bash -x
把这件事放了-XShebang线路中的选项意味着您不必键入“bash-x scriptname”。只需记住,一旦您的调试完成,就会删除“-X”。
您也可以选择仅在脚本的一部分打开调试。为此,请在脚本的脚本部分之前添加“SET -X”,然后在该部分后关闭“设置+ X”。
set -x虽然[$ i -Le 2]做回声编号:$ i((i ++))完成set + x
这-v.Bash选项类似地工作-X,但它在读取脚本中显示每行。这意味着您将看到整个脚本,然后在运行时的输出。您也可以使用-XV.随着您的抨击参数(即,Bash -XV)。
这是使用bash的一个例子-X旨在显示文件顶行的脚本的调试形式:
$ bash -x showtop ++日期+%s + startime = 1622138266 ++ - 1622138266 Showtop:第4行: - :找不到命令<===哎呀!+ echo'完成此任务需要几秒钟......'完成此任务需要几秒钟... +'['0 -lt 2']'+ echo'用法:showtop行文件'filename'用法:showtop行filename +出口
下面的第四行的输出表示存在问题。出于某种原因,脚本正在寻找命令名为“ - ”的命令。不久之后,我们看到了一个使用的语句,表明论点有问题,上面的行表明没有提供。在这种情况下,第一个错误发生了,因为$ ENDIME在脚本中的那一点没有值,使$ ENDTET等于空字符串,因此第二行的计算最终只是“ - 1622138266”,显然是无效的。
#!/ bin / bash starttime = $(日期+%s)计时=`expr $ neptime - $ starttime` echo“它需要$时刻秒来完成此任务”
该定时计算属于使用Date命令收集结束时间值后的脚本底部,如此已更正版本:
#!/ bin / bash starttime = $(日期+%s)如果[$#-lt 2];然后回显“使用率:$ 0行文件名”退出else numlines = $ 1 filename = $ 2 fi如果[$ numlines!= [0-9] *]];然后回显“错误:$ numlines不是数字”退出fi,如果[!-f $ filename];然后回声“错误:未找到文件$ filename”退出else echo文件头 - $ numlines $ filename fi Endtime = $(日期+%s)计时=`expr $ neptime - $ starttime` echo“它需要$时刻秒完成此任务“
下面是在调试模式下运行修复脚本的示例。一些底线(以粗体显示)是预期的脚本输出。另一条线是调试输出。
$ bash -x showtop 10 oderscript ++日期+%s + starttime = 1622143586 +'['2 -lt 2']'+ numlines = 3 + filename = oldscript + [[3!= [0-9] *]]]+'[''!'-f oldscript']'+文件顶部的回声顶部+ head -3 = 10 oderscript#!/ bin / bash starttime = $(日期+%s)echo“它需要$($ eMTIME - $ starttime)秒来完成此任务......”如果[$#-lt 2];然后回显“使用:$ 0行文件名”退出else numlines = $ 1++日期+%s + eMptime = 1622143586 ++ expr 1622143586 - 1622143586 +时间= 0 +回声'完成此任务需要0秒...'完成此任务需要0秒钟...
包起来
具有脚本验证参数并使用-X在获取准备好使用的脚本方面,调试选项可以非常方便,特别是对于那些比这篇文章中使用的示例更长且更复杂的那些。