3

我正在尝试编写一个小的 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
4

1 回答 1

4

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

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

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

或者,甚至更短:

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

(谢谢,格伦杰克曼!)


请注意,通常应该引用变量。这对于文件名尤其重要。如果您的文件被调用foo bar怎么办?然后你cp -f会复制foobar因为参数被空格分割。

所以,做这样的事情:

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

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

于 2013-02-20T21:28:01.033 回答