我有以下旨在执行模拟的代码。模拟完成后,它将从输出文件中删除文本,并将新编辑的输出文件用作新模拟的输入。发生的事情是我陷入了有关GROPATH文件存在的while循环中。我将以下循环打印到日志文件:
Directory path exists
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
waiting sleep 10800
GROPATH does not exist
...
它不断这样下去。
我很困惑,因为GROPATH确实存在,我可以在目录中看到确切的文件。我做错了什么导致了这个无休止的循环?我应该使用if循环吗?我正在检查文件路径映射,对我来说似乎是正确的。
#!/bin/bash
#set value of i
i=`k=$(ls md*gro -v1 | tail -n1) ; echo ${k//.gro/} | sed "s/md//"`
# while more than 20 waters ...
while (grep -c SOL md$i.gro > 20); do
DIRECTORY=~/scratch/desolvation/iteration_$i
GROPATH=~/scratch/desolvation/iteration_$i/md$i.gro
ERRORPATH=~/scratch/desolvation/log_gpu.dat
#does the directory exist?
if [ -d "$DIRECTORY" ]; then
echo "Directory path exists"
# does gro file exist?
while [ ! -d "$GROPATH" ]; do
echo "GROPATH does not exist"
if grep -q 'error' "$ERRORPATH"; then
echo "error in gromacs"; exit
else echo "waiting" sleep 10800
fi
done
我希望能够识别文件的代码确实存在,并继续进行程序的下一部分(为了简洁起见,我未包括在内),该部分将编辑GROPATH文件,以便可以将其用作下一个模拟的输入
答案 0 :(得分:2)
测试[ ! -d "$GROPATH" ]
通过该名称而不是文件检查目录。要检查文件,请使用-f
而不是-d
(或仅使用-e
,它将检查该名称的任何内容)。
其他问题:while (grep -c SOL md$i.gro > 20); do
不能满足您的要求; ()
创建一个子shell,该子shell运行grep
命令,其输出重定向到名为
“ 20”。请改用while [ "$(grep -c SOL md$i.gro)" -gt 20 ]; do
。
此外,您将echo "waiting" sleep 10800
作为单个命令,因此它打印“ sleep 10800”而不是作为命令来执行;只需将其移至另一行即可。
选择i
的方式很混乱。请尝试以下方法:
i=$(printf '%s\n' md*.gro | sed 's/^md//; s/[.]gro$//' | sort -rg | head -n1)
一般建议:通过shellcheck.net运行脚本以发现常见问题。