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