我正在尝试编写一个小的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
答案 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
会复制foo
和bar
,因为参数会被空格分割。
所以,做这样的事情:
cp -f "$FILENAME" "${FILENAME%%.*}_${i}.csv"
虽然你的文件不包含空格可能无关紧要,但你应该自动引用变量以防止将来出现任何意外。