I am trying to write a small shell script that makes the multiple copies of a file. I am able to take the file name as input but not the number of copies. Here is what I wrote. But I am unable to pass the NUMBER
variable to for loop.
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
Unfortunately it doesn't work like that. Bash performs brace expansion before parameter expansion, so your brace will be expanded before
$NUMBER
is evaluated. See also the Bash Pitfall #33, which explains the issue.One way to do this, using your code, would be:
Or, even shorter:
(thanks, Glenn Jackman!)
Note that typically, variables should be quoted. This is especially important for file names. What if your file is called
foo bar
? Then yourcp -f
would copyfoo
andbar
since the arguments are split by whitespace.So, do something like this:
While it might not matter if your files don't contain whitespace, quoting variables is something you should do automatically to prevent any surprises in the future.