Bash的for循环没有完成循环
问题描述:
我想子目录,CD的列表为每运行一个命令,这里就是我想:Bash的for循环没有完成循环
#!/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 ..
...和voilà!脚本的currect目录现在是“installedPlugins /”。
您可能打算使用cd ../..
或cd -
代替。正如命令已经指出的,它是更好地使用find
遍历目录,如:
find installedPlugins/ -type d -maxdepth 1 -exec echo "{}" \;
答
我猜第二次迭代的cd
失败,因为第一次迭代中改变你的工作目录:
- 第一次迭代,
$D
已安装Plugin/something。您将cd
转换为./installedPlugins/something/,然后cd回到./installedPlugins - 第二次迭代,
$D
已安装Plugin/somethingElse。您将cd
转换为./installedPlugins/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
执行此任务。
+1
在这个问题中没有任何建议'find'会有所改进。 – chepner
答
这是pushd
和popd
的另一种方法。他们是有点吵,所以我把他们的输出到/dev/null
:
#!/bin/bash
for D in installedPlugins/*; do
test -d "$D" && {
pushd "$D" > /dev/null
pwd
popd > /dev/null
}
done
'找到installedPlugins /型D'会给你可以用来做wahtever – anubhava
你可以用'CD中的所有子目录 - '返回到以前的目录 –
在另一个说明中,如果您只是在'installedPlugins/* /中使用'for D,您可以绕过'[-d“$ D”]'检查。 do'。 ...(注意在'*之后加''')。这也会减少循环迭代(普通文件不会成为glob扩展的一部分;只有目录) – anishsane