shell脚本常见错误包括:变量未加引号致空格截断;[命令中=前后缺空格引发语法错误;缺失shebang或执行权限导致运行失败;管道中变量赋值因子shell失效。

写 Shell 脚本时出错很常见,多数不是语法多难,而是忽略了 Shell 的行为特性。下面几个错误高频出现,搞懂它们能省下大量调试时间。
变量未加引号导致空格截断
Shell 中变量不加引号,遇到含空格的值(如文件名 my file.txt)会被拆成多个参数,命令直接报错或误操作。
- 错误写法:
cp $SRC $DEST—— 若$SRC是"a b.txt",实际执行变成cp a b.txt $DEST - 正确写法:
cp "$SRC" "$DEST"—— 双引号保留原意,空格不触发分词 - 特殊情况:数组遍历、需要分词时才考虑不加引号,绝大多数场景都该加
用 = 判断字符串相等却忘了空格
[ ] 是命令(即 test),不是语法结构,所以 = 前后必须有空格,否则会报 “command not found” 或判断永远为真/假。
- 错误写法:
if [ "$name"="john" ]; then—— 实际调用的是命令[ "$name"="john" ],找不到该命令 - 正确写法:
if [ "$name" = "john" ]; then—— 三个独立单词:[、"$name"、=、"john"、] - 更推荐用
[[ ]]:支持==,且对空格宽容些,但引号仍不能省
忘记设置 shebang 或执行权限
脚本无法运行,常因两个基础遗漏:没声明解释器,或没给执行权。
- 第一行缺失
#!/bin/bash(或#!/usr/bin/env bash),直接./script.sh会默认用sh执行,而sh不支持[[ ]]、数组、某些扩展语法 - 没运行
chmod +x script.sh,即使写了 shebang,./script.sh也会提示Permission denied - 验证方法:
file script.sh看类型,ls -l script.sh看权限位是否有x
管道中变量赋值失效(子 shell 陷阱)
在管道里给变量赋值,退出后值就丢了,因为管道每段都在独立子 shell 中运行。
- 错误写法:
echo "hello" | while read line; do msg=$line; done; echo "$msg"—— 输出为空 - 原因:
while在子 shell 中执行,msg只在该子 shell 生效 - 解决办法:
• 改用重定向代替管道:while read line; do msg=$line; done <br> • 或把逻辑包进 <code>{ }并避免管道:lines=$(echo "hello"); while read line; do ...; done <br> • 更健壮的方式是用临时文件或数组收集结果










