Make multiple copies of files with a shell script

2019-07-18 04:03发布

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

标签: linux bash shell
1条回答
forever°为你锁心
2楼-- · 2019-07-18 04:50

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:

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

Or, even shorter:

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

(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 your cp -f would copy foo and bar since the arguments are split by whitespace.

So, do something like this:

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

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.

查看更多
登录 后发表回答