共计 1260 个字符,预计需要花费 4 分钟才能阅读完成。
错误现象与典型场景
当你在终端或脚本中执行 Bash 命令时,可能会遇到如下报错:

bash: line 1: syntax error near unexpected token `<'
这种错误通常出现在以下场景中:
- 错误使用重定向符号(
<、>、<<等) - Here Document 语法格式错误
- 管道(
|)与重定向符号混用时优先级问题 - 变量赋值时意外包含特殊符号
技术原理分析
Bash 解析器对重定向符号的处理遵循严格规则:
- 重定向符号必须紧跟命令 :
<和>用于文件重定向时,左右必须保留空格(除<<和>>外) - Here Document 的特殊性 :
<<后接的终止标记必须独占一行且前后无空白字符 - 解析顺序 :重定向处理早于变量扩展,因此类似
VAR=<value的写法会被优先解释为重定向
常见错误模式分类
1. 重定向符号与变量混淆
错误示例:
# 尝试将变量赋值为包含 < 的值
VAR=<somevalue # 被解析为输入重定向
echo $VAR
修正方法:
# 使用引号包裹含特殊符号的值
VAR='<somevalue'
echo "$VAR"
2. Here Document 格式错误
错误示例:
# 终止标记前有空格
cat << EOF
内容
EOF # 错误:前导空格
正确写法:
cat <<EOF
内容
EOF # 必须顶格写
3. 管道与重定向组合问题
错误示例:
# 重定向符号位置错误
echo "text" | cat > output.txt < input.txt # 语法混乱
正确写法:
# 明确操作顺序
cat < input.txt > output.txt
完整调试案例
错误脚本示例
#!/bin/bash
# 示例 1:错误的重定向
VAR=<test # 触发错误
echo "Debug point 1" # 不会执行到这里
# 示例 2:格式错误的 Here Document
cat << END
message
END # 终止标记缩进错误
修正后版本
#!/bin/bash
# 正确变量赋值
VAR='<test'
echo "变量值: $VAR"
# 标准 Here Document
cat <<END
message
END # 正确终止标记
# 安全的重定向组合
echo "内容" > temp.txt
cat < temp.txt
rm temp.txt
最佳实践建议
- 变量赋值规范:
- 始终用引号包裹含特殊字符的字符串
-
避免变量值以
<、>、|等符号开头 -
重定向使用原则:
- 简单命令优先使用
cmd < input > output格式 -
复杂重定向考虑使用临时文件分步操作
-
Here Document 技巧:
- 使用大写终止标记(如
EOF)提高可读性 -
需要保留缩进时用
<<-配合 Tab 缩进 -
调试方法:
- 使用
bash -n script.sh检查语法 - 在可能出错的语句前加
echo调试 - 逐步注释代码块定位问题区域
扩展思考
其他可能引发类似报错的场景:
- 进程替换混淆 :
<(cmd)与< (cmd)的区别 - 数学表达式冲突 :
$((a < b))中的<需与重定向区分 - 多行注释陷阱 :
<<'COMMENT'用于注释块时引号不可省略
通过理解 Bash 的解析机制和严格遵循语法规范,可以显著减少这类语法错误的发生。建议在日常开发中结合 shellcheck 等工具进行静态检查,持续积累对 Shell 语法特性的掌握。
正文完
