我的代码不断陷入困境,而循环声明目录不存在,为什么呢?

时间:2019-06-12 03:59:53

标签: bash loops while-loop

我有以下旨在执行模拟的代码。模拟完成后,它将从输出文件中删除文本,并将新编辑的输出文件用作新模拟的输入。发生的事情是我陷入了有关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文件,以便可以将其用作下一个模拟的输入

1 个答案:

答案 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运行脚本以发现常见问题。