annoying BASH does not interpret quotation marks right?

Robert Nichols rnicholsNOSPAM at comcast.net
Sun May 7 23:39:24 UTC 2006


Filippos Klironomos wrote:
> Hello list,
> 
> I'm trying to parse a list of videos I have to convert them to a 
> different format. The video names
> have spaces in them so I do something like:
> 
> for file in *.flv ; do ffmpeg -i \"${file}\" \"${file}.avi\" ; done
> 
> but the quotmarks do not work and ffmpeg is not fed the whole video name 
> but only the
> part up to the first space so it fails. On the contrary if I just echo 
> the whole command like:
> 
> for file in *.flv ; do echo ffmpeg -i \"${file}\" \"${file}.avi\" ; done
> 
> I get exactly what I expect which is the ffmpeg command with the full 
> file names enclosed in
> quotemarks. if I just highlight that output and paste it back on the 
> command prompt it runs like
> a charm.

In both cases bash is doing exactly what it should, and that is NOT
passing a quote-enclosed file name as you think it is.  If you have
a file named

           Some file name.fli

that is getting passed as three separate arguments:

       '"Some'    'file'    'name.avi"'

where I have inserted single quote marks to delimit the arguments.
The echo command will, of course, display that as:

        "Some file name.avi"

which looks like what you want, but isn't.

Just leave out the backslashes in your command.  That will let the
shell pass each file name as a single argument with embedded white
space, and ffmpeg should be happy with that.  If, for some reason,
you really wanted to pass the file name with enclosing quote marks,
you would have to do it this way:

for file in *.flv ; do echo "\"${file}\"" "\"${file}.avi\"" ; done

-- 
Bob Nichols         Yes, "NOSPAM" is really part of my email address.




More information about the fedora-list mailing list