我是一名刚开始使用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循环。
有人可以解释我做错了吗?
非常感谢帮助。
答案 0 :(得分:2)
当前问题是您需要为外循环的每次迭代重置i
的值。
for directory in `ls $dir`; do # No! but more on that in a moment
i=0
while [ $i -le 10 ]
您的代码还有其他一些问题。
dir=$(pwd)
几乎总是毫无意义; bash
已提供包含当前工作目录名称的变量PWD
。但是,你实际上并不需要这样做;您只需使用./*/
扩展到当前工作目录中的目录列表。
切勿在脚本中使用ls
的输出。
$[...]
是过时的语法;请改用$((...))
。
稍微清理你的代码,我们得到
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
您可能想要更改的其他内容:
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
代替长期弃用的反向语法。$()
代替弃用的$(())
语法。