Shell脚本高频易错点全面梳理
一、前言Shell脚本是Linux运维、自动化批量处理、服务调度常用工具语法简洁但细节易错变量赋值、空格符号、循环判断、路径引用等细微失误都会直接导致脚本执行报错、逻辑异常甚至误删数据。本文结合实际开发场景汇总Shell常见问题并搭配可运行代码演示帮助规避日常编写脚本的各类坑点。二、变量使用常见问题2.1 赋值语句严禁多余空格Shell变量赋值规则严格等号两侧不能添加空格带空格赋值会直接判定为命令执行失败是入门最频发错误。错误示例代码# 错误写法等号前后存在空格nameshellTestecho$name正确示例代码# 规范无空格赋值nameshellTestecho$name2.2 变量引用优先双引号包裹无引号变量遇到空格、特殊字符时会被系统拆分为多个参数引发截断异常。处理带空格字符串、文件路径时必须用双引号包裹变量。错误示例代码filemy log.txtls$file正确示例代码filemy log.txtls$file三、条件判断易错问题3.1 中括号前后必须保留空格[]条件判断格式固定括号内侧缺少空格会语法报错同时整数判断、字符串判断符号不可混用。错误示例代码num10if[$num-gt5];thenecho数值偏大fi正确示例代码num10if[$num-gt5];thenecho数值偏大fi3.2 字符串相等判断符号区分字符串对比使用整数大小对比使用-gt、-lt、-eq混用符号直接判断失效。演示代码str1linuxstr2shellif[$str1$str2];thenecho字符串一致elseecho字符串不相同fi四、循环语句常见坑点4.1 for循环遍历带空格文件直接遍历目录文件文件名含空格会拆分错乱采用find结合while读取方式规避问题。错误遍历方式forfilein$(ls./);doecho$filedone稳妥遍历代码find./-maxdepth1-typef|whilereadfiledoecho$filedone4.2 while循环读取变量丢失管道符会开启子进程循环内修改的外部变量无法生效改用重定向读取文件数据。异常示例count0cattest.txt|whilereadlinedocount$((count1))doneecho$count修正示例count0whilereadlinedocount$((count1))donetest.txtecho$count五、路径与特殊符号问题5.1 相对路径执行脚本路径错乱切换目录执行脚本相对路径会随运行位置改变建议统一使用绝对路径定位文件。演示代码# 获取脚本自身绝对路径script_path$(cd$(dirname $0);pwd)echo脚本所在路径$script_path5.2 反引号与美元符命令嵌套调用命令执行结果反引号嵌套可读性差优先使用$()格式嵌套调用层级清晰不易出错。低效写法timedate%Y-%m-%d规范写法time$(date%Y-%m-%d)echo$time六、脚本权限与执行报错6.1 缺少执行权限无法运行新建脚本默认无执行权限必须赋予权限后才可直接运行仅可读文件只能依靠解释器调用。权限操作代码# 添加执行权限chmodx test.sh# 两种运行方式./test.shshtest.sh6.2 换行符格式异常报错Windows编辑的脚本换行符为CRLFLinux识别LF格式格式不符会出现未知命令错误可一键转换格式。格式转换命令dos2unix test.sh七、总结Shell脚本出错大多源于格式规范、符号空格、进程作用域三类问题编写脚本时严格遵循赋值无空格、判断留空格、变量加引号的基础规则区分字符串与整数判断语法规避子进程变量失效、路径偏移、换行格式异常问题。日常写完脚本可提前使用sh -x 脚本名调试排查快速定位语法与逻辑漏洞大幅降低线上运行故障概率。海量精选技术文档和实战案例持续更新敬请关注【风骏时光少年】