Bash - 虽然内部循环不退出

时间:2017-06-08 19:34:48

标签: bash shell loops for-loop while-loop

我是一名刚开始使用bash脚本的人。

我在当前工作目录dir1-dir10 + script.sh中有10个目录+一个名为“tocopyfile”的文件。

Dir1-10是空的。 tocopyfile是一个测试文本文件,用于我的培训目的 script.sh包含以下代码:

dir=`pwd`
i="0"
for directory in `ls $dir`;do
        while [ $i -le 10 ]
        do
        cp tocopyfile $directory/file$i &
        i=$[$i+1]
        done
done

脚本应将文件“tocopyfile”的10个副本复制到命名约定 file#中的每个目录(dir1-10)。问题是脚本存在于第一个目录之后而没有执行其余剩余目录的while循环。

有人可以解释我做错了吗?

非常感谢帮助。

2 个答案:

答案 0 :(得分:2)

当前问题是您需要为外循环的每次迭代重置i的值。

for directory in `ls $dir`; do  # No! but more on that in a moment
    i=0
    while [ $i -le 10 ]

您的代码还有其他一些问题。

  1. dir=$(pwd)几乎总是毫无意义; bash已提供包含当前工作目录名称的变量PWD。但是,你实际上并不需要这样做;您只需使用./*/扩展到当前工作目录中的目录列表。

  2. 切勿在脚本中使用ls的输出。

  3. $[...]是过时的语法;请改用$((...))

  4. 稍微清理你的代码,我们得到

    for directory in ./*/; do
        i=0
        while [ "$i" -le 10 ]; do
            cp tocopyfile "$directory/file$i" &
            i=$((i+1))
        done
    done
    

答案 1 :(得分:1)

您需要在<{1}}循环内初始化$i ,以便在for的每次迭代时$i == 0

while

您可能想要更改的其他内容:

  1. 双引所有变量(如果它们中有空格)。
  2. 使用dir=`pwd` for directory in `ls $dir`;do i="0" # <===== notice the change here while [ $i -le 10 ] do cp tocopyfile $directory/file$i & i=$[$i+1] done done 代替长期弃用的反向语法。
  3. 使用$()代替弃用的$(())语法。
  4. 收拾你的缩进。