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

我想写一个小的shell脚本,使文件的多个副本。 我可以将文件名称作为input,但不能input份数。 这是我写的。 但我无法将NUMBERvariables传递给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 

不幸的是,它不能这样工作。 Bash 在参数扩展之前执行大括号扩展 ,因此您的大括号将在$NUMBER评估之前展开。 请参阅Bash陷阱#33 ,这解释了这个问题。

一种使用代码的方法是:

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

或者,甚至更短:

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

(谢谢,Glenn Jackman!)


请注意,通常应该引用变量 。 这对于文件名是特别重要的。 如果你的文件被称为foo bar呢? 然后你的cp -f会复制foobar因为参数是被空白分隔的。

所以,做这样的事情:

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

如果你的文件不包含空格可能没有关系,引用变量是你应该自动执行的,以防止将来出现任何意外。