在我的 bash 脚本中创建 for 循环

在我的 bash 脚本中创建 for 循环

我有一个非常简单的脚本。我只想在各个目录中进行 cd 操作,如下所示:

cd PKA1/timestep_size/v_0.001/250eV
../ovitos silica_defects.py

我想以 1 为增量循环 PKA1 到 PKA24。我该怎么做?另外,有没有办法将silica_defects.py应用于每个目录并让它在其中输出文件,而不是将silica_defects.py复制到每个子文件夹(250eV子文件夹)。

答案1

bash这是's 大括号扩展的工作, {START..END}

PKA{1..24}

所以你可以这样做:

for f in PKA{1..24}/timestep_size/v_0.001/250eV/; do ...; done

对于silica_defects.py,使用文件的绝对路径。

答案2

让我们使用 for 循环生成整数 1 到 24,cd在子 shell 中使用将目录更改为子目录,然后执行脚本:

for (( i = 1; i <= 24; ++i )); do
  ( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done

cd通过使用子 shell,您可以避免在使用下一个子目录之前必须“更改回”旧目录。使用&&,您还可以避免在目录由于某种原因不存在时尝试运行该程序。

显然,你也可以这样做

for i in {1..24}; do
  ( cd "PKA$i/timestep_size/v_0.001/250eV" && ../ovitos /path/to/silica_defects.py )
done

...但出于美观原因,我不喜欢这种{start..end}语法,而且它也没有让您有机会更灵活地执行循环(在其他情况下)。

答案3

有什么问题:

for ((i=1;i<=24;i++)) ; do
    cd PKA${i}/timestep_size/v_0.001/250eV
    ../ovitos silica_defects.py
    cd $OLDPWD
done

相关内容