Linux 常见语法错误排解(附优化方法)

我的未来我决定 提交于 2019-11-26 09:01:57

对于日常使用Linux可能出现的语法错误进行排除解答优化,供参考~

1、正确案例

Vim 一个脚本来验证错误选项,首先提供一个正确无误的脚本运行
1
运行结果正确
1

2、丢失引号

编辑上述脚本,把第一个echo中末尾"去除
2
产生以下错误

未预期的文件结束符&未预期的文件结尾

在这里插入图片描述
这个脚本产生了两个错误,并且报错的位置并不在我们去除掉"的位置,这是因为:bash会跟随着第一个引号去寻找下一个引号,而它就找到了第二个echo后的引号,此时“else”也被括在了双引号中,破坏了if语句;而fi却处于了一个没有匹配的引号以内“fi? 所以报错如上。
如果安装了Vim完整版,可使用syntax on使得语句变为高亮(此处博主使用vim.tiny)

3、丢失或意外的标记

在未补全复合命令时出现,比如if或者是while。
此时我们消除掉if命令之后的分号
3
产生如下错误

未预期的符号& ‘else’

3

错误依然没有指向我们修改的行,指向了后面的else,此处的原因是因为:if能够接受一系列命令,并且计算列表中最后一个命令的退出代码。
而在这个脚本中,这个列表由单个命令组成,即[,测试的同义词。这个[命令把它后面的东西看成是一个参数列表,即有三个参数:$number,=和 ]。由于删除了分号,单词then被添加到了参数列表中,从语法讲合法。
而在这之后的“else”不再是if循环中的一部分,shell把它看做了一个保留字,因此报错。

4、预料不到的展开

可能会出现这样的情况,错误会间歇性的出现在一个脚本中,有时脚本执行正常,其他时间会失败,这是因为展开结果造成的。
本次我们把number的数值改为一个 空变量:
4
我们得到了一条错误信息和一条第二个echo输出结果
4
这是因为此时有判断[ $number = 1 ],经过展开后,number变为空值,结果就变成了[ = 1]这个是无效的,所以就产生了错误。 = 操作符是一个二元操作符(要求每一边都有数)但是第一个缺失,这样子test命令就期望用一个一元操作符(比如-Z)来代替。进一步说,因为test命令失败了,这个if接收到了一个非零退出了代码(linux里如果返回正确是“0”,返回错误是除了0以外的数),进而执行第二个echo命令。
通过给test命令中第一个参数添加“”,可以解决这个问题

逻辑错误

逻辑错误不会影响脚本运行,但会返回期望之外的结果,下面是一些在脚本中最常见的逻辑错误类型:

  1. 不正确的表达式,if/then/else
  2. “超出一个值”错误。当编写带有计数器的循环语句时,为了能在恰当的点结束,循环语句被要求从0开始计数,而并不是从1开始,此时会导致过早结束迭代或超出范围

防错编程

cd $dir_name
rm  *

上诉如果不存在dir_name文件,那就会全部删除
优化为

cd $dir_name && rm  *

但这样仍然可能出现未设置变量dir_name或其变量值为空,则删除用户家目录下的所有文件。
再次优化

[[ -d $dir_name ]]  && cd $dir_name && rm *

验证输入
所写的程序必须严格的筛选输入的数据,只有确保是有效输入才执行程序。

[[ $reply =~ ^[0-3]$ ] 

只有输入0-3 才返回0退出

追踪
当使用

bash -x

运行指令时,就会产生如下输出结果

5
执行时检查数值
在执行时使用额外echo语句可以知道脚本内部工作状态:

6
输出以下结果
在这里插入图片描述

以上就是Linux常见语法的列举和解决,只占据了其中的小部分,仅供参考~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!