修复意外令牌附近的 Bash 语法错误

在Linux Bash终端中进行编码已经成为一种常见的实践。软件工程师和学习编程语言的学生经常会遇到各种各样的错误。如果你反复遇到诸如“Syntax error near unexpected token ‘(’”或类似的Bash语法错误,那么可以尝试本文中介绍的方法,这将有助于你成为一名熟练的编码者。仔细阅读本文描述的方法和命令,你将能够修复命令行中的错误。

如何解决Bash中意外标记附近的语法错误

Linux Bash,作为基于Linux系统的命令行解释器,是Bourne Shell(sh)的替代品。 这些文件通常以.sh格式命名,用于Linux Bash脚本中。当shell脚本中的代码存在格式问题时,你可能会遇到语法错误。如果错误发生在“(”字符附近,shell会在终端上显示错误信息,并指出错误的具体行数。由于Linux Bash是一个解释器,它会在遇到错误后停止扫描脚本中的剩余命令。因此,你需要修复特定命令行中的错误,才能继续执行脚本并解决意外标记错误。以下是Linux Bash中出现意外标记附近错误的常见原因:

  • 使用了转义序列编码问题:在编写Bash脚本时,不正确的转义序列或引号的使用可能会导致错误。转义序列和引号必须使用正确的格式来避免错误。

  • 编码文件中存在不正确的语法:如果命令的语法编写错误,例如循环的顺序不正确,代码中可能会出现语法错误。

  • 命令使用不当:如果命令的使用不正确,比如值分配方式错误,也可能会导致语法错误。

  • 系统操作系统不兼容:如果编码脚本的外壳在Unix和DOS系统之间不兼容,则可能会出现意外的错误。

  • Bash Shell脚本中的问题:在另一个系统中复制的文件中的Bash Shell脚本出现问题,也可能导致意外的标记错误。

为了更好地解释,我们以一个名为example.sh的文件为例,该文件包含一些在shell脚本中常见的命令,并可能存在语法错误。

str= ‘First command line of ‘(example file)’ in the script’
str= [(1,2),(3,4)]
if[ $day == “mon” ] then
 echo “mon”
else
 echo “no mon”
fi
for VARIABLE in {0..2}; then
do echo command1; echo command2; echo command3; echo command4; done
while true; do if [ $ day == “mon” ]; then echo “mon”; else echo “not mon”; done; fi

方法一:手动修复每个命令行中的错误

修复错误的第一种方法是逐行检查并手动修复脚本中每个命令行中的语法错误。以下步骤将介绍如何解决命令行中意外标记附近的语法错误。我们首先在终端中通过运行./example.sh命令来执行该文件。

2. 注意运行结果中指出存在意外标记错误(例如“(”)的行号。

3. 按照下面描述的方法,逐个修复每一行的错误,然后保存文件。

4. 修改后再次运行文件,检查语法错误是否已解决。

第一步:读取文件内容

要解决命令行中的语法错误,第一步是读取文件内容。如果文件存在问题,你可能无法直接查看。通常的做法是使用./example.sh命令来运行文件,但这并不能让你修改文件内容。以下将介绍如何查看文件内容并修改命令行以修复意外标记附近的语法错误。

选项 1:通过cat命令

第一个选项是使用cat命令查看shell脚本中的文件内容。在终端中输入cat -v example.sh命令,即可读取包含意外标记错误的文件内容。

注1:这里使用example.sh作为示例,你需要替换成你实际出现错误的文件名。

注2:cat -v命令用于显示所有可能表示回车或不间断空格的不可见字符。

选项 2:通过vx命令

如果cat命令无法使用,你可以尝试使用vx命令来查看和更改文件中的命令。在终端中输入sh -vx ./example.sh命令以打开文件。

选项 3:通过od -a命令

如果命令行中有一些不可见的字符,可以使用od -a命令来查看文件。当文件内容在代码编辑器中不可见时,尝试使用od -a example.sh命令读取文件以进行修改。

第二步:删除Windows换行符

如果shell脚本中存在Windows换行符,你可以使用控制台命令删除这些换行符,并将代码行复制到新文件中以修复错误。

在终端中输入以下命令,将文件内容保存到另一个名为correctedexample.sh的文件中,以删除脚本中的Windows换行符。

tr -d 'r' < example.sh > correctedexample.sh

第三步:为新创建的文件设置权限

你需要为新创建的文件设置执行权限,以便它能够在shell中运行。在终端中输入chmod 755 correctedexample.sh命令,为文件赋予权限并运行该文件。现在你可以查看修改后的文件,修复格式问题,并解决文件中意外标记“(”附近的语法错误。

第四步:格式化文件中的代码

第二步是单独格式化代码行,并在文件上手动修改命令行。以下将讨论如何格式化文件以修复意外标记“(”附近的语法错误。

选项 1:用双引号替换单引号

如果命令行中使用了单引号,你需要通过将单引号替换为双引号来更改命令以修复语法错误。在example.sh文件中,删除命令中带有“’”和“’”或者单引号的代码行,并将单引号替换为双引号或“和’”。在此示例文件中,你需要将代码更改为str= "脚本中“(示例文件)”的第一个命令行"

注意:双引号对于包含参数类型命令是必需的,例如str= "[(1,2),(3,4)]"

选项 2:将$添加到字符串行

如果在脚本中添加了字符串值,你需要在字符串值前添加$以修复语法错误。 为带有字符串值的命令行添加$以修复意外错误。在此示例文件中,将命令行更改为:

str= $ 'First command line of ‘(example file)’ in the script'

注意:如果在字符串值中使用$,则可以绕过反斜杠转义序列,因为命令行由ANSI C标准解码。换句话说,通过使用$作为字符串值,你可以避免在命令行中使用双引号而不是单引号。

选项 3:将制表符转换为空格

命令中两个语句之间的空格必须是空格,而不是制表符,才能修复脚本中的语法错误。如果在Cygwin上遇到错误,可以尝试将代码中的制表符转换为空格以修复错误。命令行如下所示:

do echo command1; echo command2; echo command3; echo command4; done

应按如下所示重写上述命令以修复错误:

do echo command1; echo command2; echo command3; echo command4; done

选项 4:使用转义字符

如果使用bash字符,请务必使用转义字符和bash字符来修复语法错误。括号()是文件中的bash特殊字符,因此,你需要在命令行中使用转义字符或反斜杠来转义普通字符以执行命令。 str= 'First command line of '(example file)' in the script' 命令不会在终端中出现错误,因为使用了转义字符。

选项 5:在字符之间使用空格

shell脚本默认通过空格识别脚本中的命令和语句。你需要确保正确使用字符之间的空格,以便shell可以识别脚本中给出的命令。空格用于区分命令行中的两个字符。在代码中,if[之间没有空格,这会导致意外标记错误,因为if[命令无法被shell识别。如果将代码更改为if [ $day == "mon" ];,就可以通过shell公告命令解决该错误。

选项 6:对语句使用命令分隔符

shell脚本中的各种命令需要分成不同的语句,以便终端可以识别各个命令。你需要使用命令分隔符来修复Linux Bash中的语法错误。命令中的语句需要用命令分隔符分隔,例如分号;或按Enter键换行。例如,代码中的命令 if [ $day == "mon" ] then 必须更改为 if [ $day == "mon" ]; then 以修复错误。由于分号用作字符[then之间的命令分隔符,因此可以修复此错误。

选项 7:删除多余的语句

有时,你可能在代码中添加了多余的语句,或者在多重嵌套循环的情况下混合了代码。你需要删除命令行中多余的语句,才能修复Linux Bash中意外标记“(”附近的语法错误。bash循环的for...done或者条件语句if...fi需要使用正确的语法。示例文件中的for循环的语法有错误,它包含了在if语句中使用的then。将代码修改为以下代码可以修复意外标记的错误。语句then在代码中是一个多余的语句,删除它即可修复错误。

for VARIABLE in {0..2}; do echo command1; echo command2; echo command3; echo command4; done

选项 8:确保语句闭合的顺序正确

如果你在shell脚本中使用许多嵌套或条件语句,你必须确保循环按照打开的顺序闭合。可以使用换行符来避免循环之间的冲突。嵌套循环和条件语句的闭合顺序必须正确,不得更改。代码中的循环 while true; do if [ $day == "mon" ]; then echo "mon"; else echo "not mon"; done; fi 需要以正确的顺序闭合。将代码更改为如下所示可以修复意外的标记错误,因为闭合语句的顺序已更正。

while true; do if [ $day == "mon" ]; then echo "mon"; else echo "not mon"; fi; done

方法二:重写代码

如果你已经复制了代码并将其粘贴到终端上的新文件中,你可以尝试手动重写代码以修复错误。 如果你编写的代码在shell脚本中没有任何格式错误,那么可以修复代码中的错误。这是因为从文本编辑器(例如Microsoft Word)复制粘贴的代码中可能存在隐藏的字符和格式问题。

方法三:使用dos2unix.exe命令

如果你使用的是Unix操作系统,那么换行符使用\n来表示代码中的下一行。 但是,如果你使用的是Windows操作系统,则你需要使用回车和换行符(\r\n)来表示代码中的下一行。如果在Cygwin中执行在Windows操作系统中编写的代码,你可能会在意外标记“(”附近遇到语法错误。

要修复此错误,你需要使用DOS到Unix命令行工具作为文本文件格式转换器来清除回车符。在终端中输入以下命令dos2unix.exe example.sh,可以将文件转换为Unix格式。

***

本文讨论了修复脚本中意外标记“(”附近的Bash语法错误的基本方法。如果你在使用Linux Bash,可以使用本文中介绍的方法来修复Bash语法错误。如果你觉得本文对你有帮助,请在评论区留下你的建议和疑问。