对于日常使用Linux可能出现的语法错误进行排除解答优化,供参考~
1、正确案例
Vim 一个脚本来验证错误选项,首先提供一个正确无误的脚本运行
运行结果正确
2、丢失引号
编辑上述脚本,把第一个echo中末尾"去除
产生以下错误
未预期的文件结束符&未预期的文件结尾
这个脚本产生了两个错误,并且报错的位置并不在我们去除掉"的位置,这是因为:bash会跟随着第一个引号去寻找下一个引号,而它就找到了第二个echo后的引号,此时“else”也被括在了双引号中,破坏了if语句;而fi却处于了一个没有匹配的引号以内“fi? 所以报错如上。
如果安装了Vim完整版,可使用syntax on使得语句变为高亮(此处博主使用vim.tiny)
3、丢失或意外的标记
在未补全复合命令时出现,比如if或者是while。
此时我们消除掉if命令之后的分号
产生如下错误
未预期的符号& ‘else’
错误依然没有指向我们修改的行,指向了后面的else,此处的原因是因为:if能够接受一系列命令,并且计算列表中最后一个命令的退出代码。
而在这个脚本中,这个列表由单个命令组成,即[,测试的同义词。这个[命令把它后面的东西看成是一个参数列表,即有三个参数:$number,=和 ]。由于删除了分号,单词then被添加到了参数列表中,从语法讲合法。
而在这之后的“else”不再是if循环中的一部分,shell把它看做了一个保留字,因此报错。
4、预料不到的展开
可能会出现这样的情况,错误会间歇性的出现在一个脚本中,有时脚本执行正常,其他时间会失败,这是因为展开结果造成的。
本次我们把number的数值改为一个 空变量:
我们得到了一条错误信息和一条第二个echo输出结果
这是因为此时有判断[ $number = 1 ],经过展开后,number变为空值,结果就变成了[ = 1]这个是无效的,所以就产生了错误。 = 操作符是一个二元操作符(要求每一边都有数)但是第一个缺失,这样子test命令就期望用一个一元操作符(比如-Z)来代替。进一步说,因为test命令失败了,这个if接收到了一个非零退出了代码(linux里如果返回正确是“0”,返回错误是除了0以外的数),进而执行第二个echo命令。
通过给test命令中第一个参数添加“”,可以解决这个问题
逻辑错误
逻辑错误不会影响脚本运行,但会返回期望之外的结果,下面是一些在脚本中最常见的逻辑错误类型:
- 不正确的表达式,if/then/else
- “超出一个值”错误。当编写带有计数器的循环语句时,为了能在恰当的点结束,循环语句被要求从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
运行指令时,就会产生如下输出结果
执行时检查数值
在执行时使用额外echo语句可以知道脚本内部工作状态:
输出以下结果
以上就是Linux常见语法的列举和解决,只占据了其中的小部分,仅供参考~
来源:CSDN
作者:not color ancestor
链接:https://blog.csdn.net/weixin_41744624/article/details/103238412