Bash: синтаксическая ошибка рядом с неожиданным токеном '('

Я новичок в Linux. Следуя некоторому руководству, я использовал следующую команду, которая разбила мой tin.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-оболочки, а не в семействе оболочек Bourne.

Вы можете установить и использовать 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
Другие вопросы по тегам