bash循环未完成循环

  • 本文关键字:循环 未完成 bash bash
  • 更新时间 :
  • 英文 :


我想获取一个子目录列表,cd到每个子目录并运行一个命令,这是我正在尝试的:

#!/bin/bash
for D in installedPlugins/*; do
    if [ -d "${D}" ]; then
        cd "${D}" && echo "${D}" && cd ..
    fi
done

它对第一个子目录执行此操作,但由于某种原因不会继续。

> 您的脚本将 2 个目录遍历到 ${D} 中,但只有一个目录输出 ( cd .. )。例如:

cd "installedPlugins/SomeDir" && echo "installedPlugins/SomeDir" && cd ..

瞧!脚本的 currect 目录现在是 "installedPlugins/"。

您可能打算改用cd ../..cd -。如命令中所述,最好使用 find 遍历目录,例如:

find installedPlugins/ -type d -maxdepth 1 -exec echo "{}" ;
这是

pushdpopd的另一种方式。它们有点嘈杂,所以我将它们的输出发送到/dev/null

#!/bin/bash
for D in installedPlugins/*; do
    test -d "$D" && {
        pushd "$D" > /dev/null
        pwd
        popd > /dev/null
    }
done 

我猜第二次迭代的cd失败,因为第一次迭代改变了你的工作目录:

  • 第一次迭代,$D安装了插件/东西。你cd ./installedPlugins/something/,然后 cd 回到 ./installedPlugins
  • 第二次迭代,$D 已安装插件/其他东西。 你cd ./installed插件/somethingElse,但这失败了,因为你已经进入了 installedPlugins。

您可以使用一个简单的find来解决您的问题:

find ./installedPlugins/ -type d

一旦你cd,问题就在于你在一个更深的目录中:

for D in installedPlugins/*; do
    if [ -d "${D}" ]; then
        cd "${D}" && echo "${D}" && cd ../.. # notice change here
    fi
done

在第一个cd,相对于你的点,你必须深度为2,而不是1。所以你需要回到 2 个级别。

注意:您应该为此任务使用find

最新更新