Rob Cowell
Rob Cowell

Reputation: 1628

Bash script for downloading files with Curl

I'm trying to knock together a little batch script for downloading files, that takes a URL as its first parameter and a local filename as its second parameter. In testing I've learned that its tripping up on spaces in the output filename, so I've tried using sed to escape them, but its not working.

#!/bin/bash
clear
echo Downloading $1
echo
filename=`sed -e "s/ /\\\ /g" $2`
echo $filename
echo eval curl -# -C - -o $filename $1

but I get the message

sed: outfile.txt: No such file or directory

which suggests its trying to load the output file as input to sed instead of treating the output filename as a string literal.

What would be the correct syntax here?

Upvotes: 3

Views: 26445

Answers (4)

cms
cms

Reputation: 5982

quoting the arguments correctly, rather than transforming them might be a better approach

It's quite normal to expect to have to quote spaces in arguments to shell scripts

e.g.

#!/bin/bash
clear
echo Downloading $1
echo `curl -# -C - -o "${2}" "${1}"`

called like so

./myscript http://www.foo.com "my file"

alternatively, escape the spaces with a '\' as you call them

./myscript http://www.example.com my\ other\ filename\ with\ spaces

Upvotes: 5

sud03r
sud03r

Reputation: 19779

if $2 is a text input then try

echo $2 | sed 's: :\\\ :g '

I generally avoid backslashes in sed delimiters are they are quite confusing.

Upvotes: 0

Dennis Williamson
Dennis Williamson

Reputation: 360545

curl -# -C - -o "$2" $1

Upvotes: 2

Nick Fortescue
Nick Fortescue

Reputation: 44193

I agree with cms. Quoting the input arguments correctly is much better style - what will you do with the next problem character? The following is much better.

curl -# -C - -o "$2" $1

However, I hate people not answering the asked question, so here's an answer :-)

#!/bin/bash
clear
echo Downloading $1
echo
filename=`echo $2 | sed -e "s/ /\\\ /g"`
echo $filename
echo eval curl -# -C - -o $filename $1

Upvotes: 4

Related Questions