【问题标题】:Why getting a syntax error near unexpected token on running a shell script in Ubuntu?为什么在 Ubuntu 中运行 shell 脚本时出现意外标记附近的语法错误?
【发布时间】:2015-11-29 09:28:24
【问题描述】:

我正在尝试在 Ubuntu 操作系统上运行 NS-2 模拟。

说实话,我是 Ubuntu 操作系统和批处理文件的新手。

通过输入:

bash bat.sh

我收到以下错误:

bat.sh: line 1: syntax error near unexpected token `%%a'
'at.sh: line 1: `for /L %%a in (200,380,4000) do (

bat.sh:

for /L %%a in (200,380,4000) do (
ns lab5.tcl %%akb )

第二行正是我想要做的。我正在发送一个 200 kb、580 kb 等的变量。

在 Windows 上运行这个批处理文件可以正常工作。

【问题讨论】:

  • 首先,batch 是一个术语,用于在 Windows、MS DOS 或 IBM OS/2 上由命令处理器执行的脚本。 Linux 不支持批处理文件。在 Linux 上,您必须编写 shell 脚本,这需要与 Windows 上的批处理脚本完全不同的语法。 Linux 上有几种 shell 解释器:bash、sh、ksh、……它们的语法也不同。您显然在使用 bash。因此,在搜索 Ubuntu shell 脚本的命令时,请始终包含关键字 bashshell,而不是 batch
  • 这会让事情变得更清楚。虽然我在互联网上找到了一个 bash 语法,但它仍然不起作用..
  • 其次,在 Windows 文本文件中,回车符 \r 加上换行符 \n 作为行终止符。在 Linux 文本文件中,只有 \n 作为行终止符。 Shell 脚本通常不适用于以\r\n 结尾的行。使用 Ubuntu 上的文本编辑器创建 shell 脚本,这些脚本默认保存,换行符仅作为行终止符。在 另存为 窗口中,通常可以使用 \r\n 为已创建的 shell 脚本选择行终止类型,以将文件保存为 UNIX 格式。在使用 Windows 文本编辑器时,请确保以 UNIX 格式保存 shell 脚本。
  • 非常感谢!它用下面的代码解决了这个问题(由emi)
  • geditPreferences 中查找 EOL 设置,并确保选择了 Unix(仅换行)。在 Save As 窗口中,您还应该看到一个 EOL(行尾)选项。还有 gedit 插件Newline Madness 可能对你有帮助。

标签: shell ubuntu ns2


【解决方案1】:

您的 bash 代码有问题。首先,您可能希望在文件的最开头添加 hassbang/shebang (https://en.wikipedia.org/wiki/Shebang_(Unix)),因此您无需在每次运行时都指定解释器,您可以这个文件可以用chmod +x bat.sh 执行。其次,我不知道您在 for 上使用的语法(http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html)。我宁愿写这样的东西:

#!/bin/bash

for i in 200 380 4000
do
   ns lab5.tcl ${i}kb
done

【讨论】:

  • 非常感谢!!似乎语法未知,因为它适用于 Windows...我已经尝试过您的代码,它给出了以下错误: bat.sh: line 4: syntax error near unexpected token $'do\r'' 'at.sh: line 4: do 试图删除一些回车,现在它给出: bat.sh:第 3 行:意外标记附近的语法错误 ns' 'at.sh: line 3: ns lab5.tcl ${i}kb 对于代码:#!/bin/bash for i in 200 380 4000 do ns lab5.tcl ${ i}kb 完成 P.S.我不知道为什么
    对我的评论不起作用:(
  • 在您的示例中,您似乎尝试执行名为ns 的命令,我复制并更正了变量引用。如果找不到,您可能需要将其添加到您的 PATH 环境变量中,使用完整路径 (/full/path/to/ns ...) 调用它或使用本地路径 (./ns ...) 调用它。
  • 我已经添加了 ns.. 的路径。在终端上运行 'ns lab.tcl 200kb' 效果很好。
  • 你试过放完整路径吗?我不知道 Windows 究竟是如何工作的:也许 ns 是一个保留字。另请注意,此代码需要完全像这样编写。如果你喜欢用更少的行来做,你需要分号:for i in 200 380 4000; do ns lab5.tcl ${i}kb ; done;
  • 您的代码符合 Mofi 的建议(将文件类型更改为 linux 而不是 windows),非常感谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多