为什么for循环中的代码只在bash shell的第一个目录中执行?

为什么for循环中的代码只在bash shell的第一个目录中执行?

在一个名为 的目录下a有许多子文件夹,我想在其中执行某些操作。对所有人都一样。我执行以下操作,但它仅适用于第一个子目录:

for i in "a/*"
    do
            #echo $i
            cd $i
            mkdir test
            mv *_no test
            touch aaa
            cd ..
    done

上面的代码我想在a.

答案1

第一个cdchdirs 进入第一个目录(两级子目录)。之后你就无法cd进入第二个,因为你只返回了一个级别,所以你没有回到你开始的地方。但即便如此,您还是在循环一个值:“a/*”。

由于您已经对此进行了引号,因此它不会被扩展。

然而,您忘记了在 周围加上引号$i,因此它确实在那时作为 的参数进行了扩展cd

您的代码还有很多其他问题。

一些改进建议:

for i in a/*/; do
  (
    cd -- "$i" &&
      mkdir -p test || exit
    mv -- *_no test
    touch aaa
  )
done

答案2

使用globs 时,应删除引号。如果不是,则globs 不会扩展。

所以 :

for i in a/*

答案3

在循环内引用 $i 不会执行任何操作,因为a/*/它已经扩展为单词。例如如果a/*/扩展到a/My Documents/,在第一个循环$i = a/My和第二个循环中$i = Documents/ 尝试

find . -maxdepth 1 -type d | while read i; do
  (
    cd -- "$i" &&
      mkdir -p test || exit
    mv -- *_no test
    touch aaa
  )
done

相关内容