【发布时间】:2018-11-15 00:02:05
【问题描述】:
我正在尝试将 *.csh 脚本转换为 *.sh。我在这个块上遇到了麻烦。
foreach f (tmp*)
echo $f
set zid = `grep db $f`
if !(-e "$zid".mol2) then
set filename = "$zid".mol2
else foreach n (`seq -w 1 11247`)
if !(-e "$zid"_"$n".mol2) then
set filename = "$zid"_"$n".mol2 break
endif
end
endif
mv -v $f $filename
end
我试着把它改成这样:
for f in tmp*
do
echo $f
set zid = `grep db $f`
if ! [-e "$zid".mol2] ; then
set filename = "$zid".mol2
else for n in `seq -w 1 11247`
if ! [-e "$zid"_"$n".mol2] ; then
set filename = "$zid"_"$n".mol2
break
fi
done
fi
mv -v $f $filename
done
但我收到此错误:
./scripts/ex01.sh: line 31: syntax error near unexpected token `if'
./scripts/ex01.sh: line 31: `if ! [-e "$zid"_"$n".mol2] ; then'
这部分我也有问题cat $VSTROOT/db.mol2 | csplit -ftmp -n4 -ks - '%^@.TRIPOS.MOLECULE%' '/^@.TRIPOS.MOLECULE/' '{*}'
我在哪里预设VSTROOT=pwd,但执行时它告诉我cat: pwd/db.mol2: No such file or directory。
【问题讨论】:
-
Bash(逻辑否定)[tldp.org/LDP/abs/html/comparison-ops.html] is !=
-
VSTROOT=$(pwd)调用命令,或者使用内置变量VSTROOT=$PWD -
另外,您可以将 shell 代码粘贴到 shellcheck.net 以获得语法和最佳实践方面的帮助
-
您似乎将
[ -e拼错为[-e。在求助于互联网的智慧之前,通过shellcheck(或使用在线服务)运行您的代码。哦,你错过了do,但错误消息已经告诉你了。 -
我试过
VSTROOT=$(pwd)还是不行。它似乎适用于从 echo 到 ls 的所有东西,但 cd 只是不起作用。无论如何我可以解决这个问题吗?