Bash:意外标记‘(’附近出现语法错误

Bash:意外标记‘(’附近出现语法错误

我是 Linux 新手。按照一些教程,我使用了以下命令,将我的 zinc.mol2 拆分为 1000 个名为 tmp 的文件。

cat zinc.mol2 | csplit -ftmp -n4 -ks - '%^@.TRIPOS.MOLECULE%' '/^@.TRIPOS.MOLECULE/' '{*}'

现在我必须按照教程使用以下脚本。当我使用第一部分时foreach f (tmp*),我得到了bash: syntax error near unexpected token '('

有人可以指导我如何成功运行以下脚本吗?

# Rename the tmp file according to ZINC identifier
# Here the outline of how we do this:
#    1. extract ZINCn8 from the tmpNNNN file and set to variable
#    2. if the Zn8.mol2 file does not exist, the rename the tmpNNNN file

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

答案1

您尝试运行的代码似乎是 C-shell 的语法,而不是 Bourne 系列 shell 的语法。

您可以安装并使用 C-shell - 例如,tcsh

sudo apt-get install tcsh

csh

或者将代码转换为bash等效代码:由于我无法访问您的输入文件,因此以下内容未经测试,但应该接近

for f in tmp*; do
  echo "$f"

  zid="$(grep ZINC "$f")"
  if [ -e "${zid}.mol2" ]; then
    filename="${zid}.mol2"
  else
    for n in {01..99}; do
      if [ -e "${zid}_${n}.mol2" ]; then
        filename="${zid}_${n}.mol2"
        break;
      fi
    done
  fi

  mv -v "$f" "$filename"

done

相关内容