shell scripting advise: Don't use backslashes inside backtick quotes

Roland Illig roland.illig at gmx.de
Wed Aug 3 23:19:50 UTC 2005


I have tried to write a proper shell quoting function, like this:

quote() {
         _q=`echo x"$1" | sed -e '1s,^x,,' -e s,\',\'\\\\\\\\\'\',g`
         echo "'${_q}'"
}

It converts foo'bar into 'foo'\''bar', as well as foo_bar into 'foo_bar'.

Note how I didn't use backticks inside the echo command. I think it 
increases portability and may also be easier for humans to understand. 
But what has always made me wonder was the high number of backslashes 
needed in the sed expression that changes every ' into a '\''.

Now I found the answer and rewrote the function:

quote() {
	_sedexpr="s,','\\\\'',g"
         _quotestr=`echo x"$1" | sed -e '1s,^x,,' -e "${_sedexpr}"`
         echo "'${_quotestr}'"
}

The trick was to factor out the backslashes from the backticks, 
and---tadaaa---there are just four left. After the shell has interpreted 
the string literal, it is s,','\\'',g -- and this is fed to sed. This is 
easily explained, as opposed to my first version, which took about a 
month until I found out why all those backslashes have to be there.

So if you ever use backticks, please don't use backslashes inside them.

Roland



More information about the mc-devel mailing list