bash:语法接近意外错误'('

bash:语法接近意外错误'('

我正在学习计算微生物学教程:

第 10 页包含ex01.csh(原始未缩进,由 StackExchange 参与者添加的缩进):

foreach f (tmp*)
  echo $f
  set zid = `grep ZINC $f`
  if !(-e "$zid".mol2) then
     set filename = "$zid".mol2
  else foreach n (`seq –w 1 99`)
    if !(-e "$zid"_"$n".mol2) then
      set filename = "$zid"_"$n".mol2
      break
    endif
   end
   endif
   mv –v $f $filename
end

我想运行上面的命令。过去两天我一直在尝试解决这个问题,但失败了。每一次,在第一步的时候,

foreach f (tmp*)

它说

bash : syntax near unexpected error '(' 

我对 Linux 的了解为零,并且只是按照我在教程中看到的内容进行操作。我该如何解决我的问题?

答案1

正如 @Archemar 正确指出的那样,这是一个 cshell 脚本,它不能在默认的 Linux shell 中运行。

如果在 Debian 中执行以下操作:

apt-get install tcsh

并添加为脚本的第一行:

#!/bin/tcsh

答案2

您引用的教程csh自始至终都在使用 shell,但您正在尝试使用bashshell 来执行它(从您收到的错误消息中可以明显看出)。

这两个 shell 的语法非常不同,不能互换使用来运行脚本。将它们视为两种独立的编程语言。

  • 确保脚本具有#!/bin/csh第一行(此后没有其他内容,我在教程中发现一个脚本,该脚本立即在同一行上有注释,这是错误的)。

  • chmod +x script.csh通过发出命令(其中script.csh是包含脚本的文件的名称)来确保脚本可执行。

  • 使用 运行脚本./script.csh

或者:

  • 通过显式向解释器提供 来运行脚本csh script.csh

显然,如果csh您的系统上没有安装,您必须首先处理它。根据您的 Unix 使用的包管理器,可以通过不同的方式完成此操作。

如今,看到为 shell 脚本编写的情况相当罕见csh,尤其是在免费的 Unices 上,因为大多数人都将其默认设置切换为bash、 some ksh-variant 或某些其他sh兼容的 shell。

Tom Christiansen(Perl 人)在 1994 年写了一篇文章,几年前我经常看到它被引用得更频繁,但现在却很少见了(可能是因为许多用户根本不知道存在兼容外壳以外的任何东西sh)。它的标题是“CSH 编程被认为是有害的”。

相关内容