共计 1553 个字符,预计需要花费 4 分钟才能阅读完成。
错误现象与常见场景
当你在终端或脚本中执行 Bash 命令时,如果突然看到这样的报错:

bash: line 1: syntax error near unexpected token `<'
这通常意味着 Bash 在解析脚本时遇到了意外的 < 符号。这个错误特别常见于以下场景:
- 在命令行中直接使用重定向符号时
- 在脚本中使用 here document(文档内嵌)时格式错误
- 变量赋值或字符串比较时意外使用了
<符号
错误原因深度分析
这个错误的本质是 Bash 解释器在预期某种语法结构的地方遇到了不符合预期的 < 符号。主要原因包括:
- 重定向符号使用不当 :Bash 中
<用于输入重定向,但它的使用有严格语法要求 - here document 格式错误 :使用
<<标记时,结束标记格式不正确 - 比较运算符混淆 :在
[]或[[]]测试中误用了<而非-lt - 字符串包含特殊字符 :未转义的字符串中包含
<符号
典型错误案例与修复方案
案例 1:简单的重定向错误
错误代码:
echo "Hello" < file.txt
错误原因: echo不接受输入重定向,<在这里是多余的
修复方案:
echo "Hello" > file.txt # 正确:输出重定向
cat < file.txt # 正确:输入重定向
案例 2:here document 格式错误
错误代码:
cat << EOF
This is a test
EOF<
错误原因: 结束标记 EOF 后面多了一个 < 符号
修复方案:
cat << EOF
This is a test
EOF # 正确:结束标记必须单独一行,没有多余字符
案例 3:数值比较错误
错误代码:
if [$a < $b]; then
echo "a is less than b"
fi
错误原因: 在 [] 测试中应该使用 -lt 而不是<
修复方案:
if [$a -lt $b]; then # 正确:使用 -lt 进行数值比较
echo "a is less than b"
fi
# 或者在 [[]] 中使用 <
if [[$a < $b]]; then # 注意:这会进行字符串比较
echo "a is less than b"
fi
Bash 脚本调试技巧
-
使用 - x 选项 :在脚本开头添加
set -x或在执行时使用bash -x script.sh -
检查语法而不执行 :使用
bash -n script.sh可以只检查语法不实际运行 -
逐步执行 :在关键部分添加
read -p "Press enter to continue"暂停执行 -
输出变量值:在怀疑有问题的地方添加
echo "Debug: var=$var"
最佳实践建议
- 始终在脚本开头使用
#!/bin/bash指定解释器 - 使用
set -euo pipefail让脚本在出错时立即退出 - 对包含特殊字符的字符串使用引号
- 使用
shellcheck工具静态检查脚本 - 复杂的重定向操作添加注释说明
常见问题 FAQ
Q1:为什么在命令行直接输入 < 会报错?
A:单独使用 < 没有提供输入源文件,是无效语法。
Q2:如何在字符串中使用 < 符号而不报错?
A:用引号包裹字符串:echo "3 < 5"或转义符号:echo 3 \< 5
Q3:<和 << 有什么区别?
A:<是输入重定向,<<是 here document 的开始标记。
动手实践建议
尝试创建一个包含以下内容的脚本并运行:
#!/bin/bash
# 正确的 here document 示例
cat << END
This is a multi-line
text using here document
END
# 正确的数值比较
a=3; b=5
if [$a -lt $b]; then
echo "$a is less than $b"
fi
进一步学习资源
- Bash 官方文档:
man bash - Google Shell Style Guide
- ShellCheck 在线工具:https://www.shellcheck.net/
- 《Bash Guide for Beginners》电子书
通过理解这些常见错误模式,你可以更高效地编写和调试 Bash 脚本。记住,遇到错误时不要慌张,仔细阅读错误信息,逐步排查问题根源。
正文完
