使用shell脚本制作多个文件副本

时间:2013-02-20 21:23:20

标签: linux bash shell

我正在尝试编写一个小的shell脚本来生成文件的多个副本。我可以将文件名作为输入而不是副本的数量。这是我写的。但我无法将NUMBER变量传递给for循环。

echo -n "Enter filename: "
read FILENAME
echo -n "Number of copies to be made: "
read NUMBER
for i in {2..$NUMBER}
do
cp -f $FILENAME ${FILENAME%%.*}"_"$i.csv
done

1 个答案:

答案 0 :(得分:3)

不幸的是,它并不像那样。 Bash performs brace expansion before parameter expansion,因此在评估$NUMBER之前,您的大括号将被展开。另请参阅Bash Pitfall #33,其中解释了该问题。

使用您的代码执行此操作的一种方法是:

for i in $(eval echo {2..$NUMBER})
do
# ...
done

或者,甚至更短:

for i in $(seq 2 $NUMBER)
# ...

(谢谢,格伦杰克曼!)


通常请注意variables should be quoted。这对文件名尤其重要。如果您的文件被称为foo bar怎么办?然后,cp -f会复制foobar,因为参数会被空格分割。

所以,做这样的事情:

cp -f "$FILENAME" "${FILENAME%%.*}_${i}.csv"

虽然你的文件不包含空格可能无关紧要,但你应该自动引用变量以防止将来出现任何意外。