我想写一个小的shell脚本,使文件的多个副本。 我可以将文件名称作为input,但不能input份数。 这是我写的。 但我无法将NUMBER
variables传递给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
会复制foo
和bar
因为参数是被空白分隔的。
所以,做这样的事情:
cp -f "$FILENAME" "${FILENAME%%.*}_${i}.csv"
如果你的文件不包含空格可能没有关系,引用变量是你应该自动执行的,以防止将来出现任何意外。