(029) Linux之shell故障诊断
十年运维系列之基础篇 - Linux
作者:曾林
版权:文章未经同意请勿转载
一、引言
随着脚本的复杂度越来越高,当脚本出现错误或者执行情况和预期不同的时候,就需要看看是哪里出现了问题。本章将讲解一些脚本中常见的错误类型以及几种用于追踪和解除错误的有用技巧。
二、语法错误
语法错误是一种常见的错误类型,其中就包括了shell语句中一些元素的拼写错误。在大多数情况下,shell会拒绝执行含有此种类型错误的脚本。
在接下来的讨论过程中,我们将使用以下脚本(foo.sh)来演示常见的错误类型。具体如下代码:
#!/bin/bash # foo: script to demonstrate common errors number=1 if [[ $number == 1 ]];then echo "number is equal to 1." else echo "number is not equal 1." fi exit
此脚本经过运行后并没有错误,而且可以正常运行。运行结果如下图所示:
1. 引号缺失
现在修改上述脚本,删除第一个echo命令后实参后的双引号。具体如下图:
#!/bin/bash # foo: script to demonstrate common errors number=1 if [[ $number == 1 ]];then echo "number is equal to 1. else echo "number is not equal 1." fi exit
运行后的结果如下图所示:
此删除动作使脚本产生了两个错误。有趣的是,错误报告指出的行并不是之前所删除双引号所在的行,而是之后的代码。可以看到,当系统读取到所删除双引号的位置之后,bash将继续向下寻找与前双引号对应的引号,这样的行为会一直延续到bash找到目标,也就是在第二个echo命令后的第一个引号处。然后bash就陷入了混乱之中,即if命令的语法结构被破坏了,fi语句现在处于了引号标识(但是又只有一边存在引号)的字符串中。
这种类型的错误在长脚本中很难发现,而使用带有语法结构突出显示功能的编辑器能够帮助找到这类错误。如果系统配备的是完整版的vim,可使用以下命令启用vim的语法结构突出显示功能。语法如下:
:syntax on
2. 符号缺失
另一种常见的错误是如if或while这样的复合命令结构不完整。比如我们现在就删除上面脚本中的if命令中的test部分后的分号,看看会发生什么情况。代码如下:
#!/bin/bash # foo: script to demonstrate common errors number=1 if [[ $number == 1 ]] then echo "number is equal to 1." else echo "number is not equal 1." fi exit
执行结果如下图所示:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。