Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在下一次迭代之前,将Bash For循环更改回原始目录_Bash - Fatal编程技术网

在下一次迭代之前,将Bash For循环更改回原始目录

在下一次迭代之前,将Bash For循环更改回原始目录,bash,Bash,我有一个for循环,它列出了所有工作正常的子目录,但我想输入每个目录,运行一个命令,然后移动到下一个目录,但它只是停留在它输入的第一个目录中 剧本: #!/bin/bash for i in $(ls -l ../terraform/envs/ | grep ^d | tr -s ' ' | cut -d ' ' -f 9 ); do echo $i | awk -v i="$i" !'/maint|template/' cd ../terraform/envs//$i

我有一个for循环,它列出了所有工作正常的子目录,但我想输入每个目录,运行一个命令,然后移动到下一个目录,但它只是停留在它输入的第一个目录中

剧本:

#!/bin/bash
for i in $(ls -l ../terraform/envs/ | grep ^d | tr -s ' ' | cut -d ' ' -f 9 );
  do
    echo $i | awk -v i="$i" !'/maint|template/'
    cd ../terraform/envs//$i
    echo $PWD
    break
    #terragrunt plan
done
使用pushd代替cd;然后可以使用popd返回到原始目录

不相关,但没有必要像这样使用ls。改用glob

cd terraform/envs
for i in */; do
    pushd "$i" > /dev/null
    echo "$PWD"
    popd > /dev/null
done
当然,在这里,循环之前的cd命令意味着您可以只使用cd$i和cd..,但是pushd/popd对于任意目录更改非常有效,而不仅仅是简单的一步后退


请注意,如果多次使用pushd,则需要将适当的参数传递给popd,以确保返回到正确的堆栈项,或调用popd适当的次数。

首先,要回答您的问题,可以通过cd-命令返回到上一个目录。它将打印出您返回的目录。如果不需要该输出,请重定向到/dev/null,例如:

此外,正如@Cyrus所提到的,解析ls输出通常是个坏主意。有很多选择,我建议从find中读取变量,例如:


是的,pushd和popd没有得到应有的使用。当然,让那些正在学习的人知道他们可以重定向到/dev/null以抑制输出也很有用。如果你知道有多少人没有捕捉到输出,你会感到惊讶。。。。例如,pushd$i>/dev/null和下面相同的popd。此外,如果没有其他cd命令,cd-only会执行您想要的操作。否则,您需要在第一个cd命令之前明确记住工作目录,以便在最后还原它。@chepner在我提到的示例中,什么情况不起作用?@chepner cd-应该可以,因为他建议AFAIKI严重怀疑echo$PWD是要在新目录中执行的全部代码。cd-可能有效,但如果不知道更改目录后实际执行的是什么,就不可能说。使用pushd/popd的正确方法是在您自己的代码中始终有一个匹配的对。
#!/bin/bash
for i in $(ls -l ../terraform/envs/ | grep ^d | tr -s ' ' | cut -d ' ' -f 9 );
  do
    echo $i | awk -v i="$i" !'/maint|template/'
    cd ../terraform/envs//$i
    echo $PWD
    cd - > /dev/null
    break
    #terragrunt plan
done
while read i;
  do
  # do something
done < <(find ../terraform/envs/ -mindepth 1 -maxdepth 1 -type d)
#!/bin/bash
while read i;
  do
    echo "$i" | awk -v i="$i" !'/maint|template/'
    cd "../terraform/envs//$i"
    echo $PWD
    cd - > /dev/null
    break
    #terragrunt plan
done < <(find ../terraform/envs/ -mindepth 1 -maxdepth 1 -type d)