Bash for循环无法完成循环

时间:2016-04-28 12:17:01

标签: bash

我想获得一个子目录列表,cd进入每个子目录并运行一个命令,这就是我正在尝试的内容:

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

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

4 个答案:

答案 0 :(得分:2)

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

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

...和voilà!您脚本的当前目录现在是“installedPlugins /".

您可能打算使用cd ../..cd -代替。正如命令中已经提到的,最好使用find迭代目录,例如:

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

  • 第一次迭代,$D是installedPlugins / something。您cd进入./installedPlugins/something/,然后回到./installedPlugins
  • 第二次迭代,$D是installedPlugins / somethingElse。你{/ 1}}进入./installedPlugins/somethingElse,但由于你已经进入installedPlugins而失败了。

您可以使用简单的cd来解决问题:

find

答案 3 :(得分:0)

问题是,在您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执行此任务。