-   Ubuntu (
-   -   Lost with single and double quotes with bash! (

Fnux 03-30-2013 08:01 PM

Lost with single and double quotes with bash!
Hello all,

I'm trying to automatize the installation of weighttp, a simple and light web server benchmark tool that is using libev.

I'm using Ubuntu Server 12.04.4 LTS without a GUI.

I wrote a little script ( to do so, but the last part doesn't work.


# Download and Install both libev and weighttp.
cd Downloads
tar -xzf libev-4.15.tar.gz
apt-get -y build-dep libev
apt-get -y install libev-dev
cd libev-4.15
sudo make install
cd ..
tar -xzf weighttp-master.tar.gz
cd weighttp-master
gcc -g2 -O2 -DVERSION='"123"' src/*.c -o weighttp -lev -lpthread <- This is where I've a problem !
sudo cp ./weighttp /usr/local/bin
cd ../..

As a matter of fact, the compilation of weighttp doesn't work since its command line obvioulsy stops when the first single or double quote is intrepreted.

However, I've read a number of documents with regard to bash and its quotes, but no one gave me a way to make what I expect to do.

I've try a number of combinations using the character \ before the single and/or the double quotes but I didn't find any one working !

Note: If I use all these commands, one after one in a terminal session, it works !

However, I'ld love to make the script working too.

Any help will be trully appreciated because I'm a real dumb newbee with bash.


David the H. 03-31-2013 11:07 AM

One secret is to stop thinking of quotes as enclosures, and more like toggle switches. They turn shell interpretation of characters on and off.* The only difference between single and double quotes is that double quotes continue to allow interpretation of a few characters, specifically "$,`,\", which allows parameter expansion and backslash escaping to continue happen. See the QUOTING section of the bash manpage for more details on how various characters are treated.

Another thing to understand is that pretty much everything the shell does, including quoting, only has one final purpose -- to create a list of arguments (tokens) for the command being run. Syntactical quotes are actually among the first things processed, and are removed from the line. Only if a quote mark is escaped by another quote or backslash will it become part of the argument itself. But the vast majority of commands do not accept literal quotes anyway.

As for this:


gcc -g2 -O2 -DVERSION='"123"' ...
The first single quote toggles interpretation off, so everything up to the next single quote, including the two double-quotes, are treated as literal characters. The single quotes themselves are removed from the line. So after processing by the shell, gcc gets launched with the literal string:


...including the quotes. Now, does gcc need it to look like this, or not? I really don't know, as my experience with it is limited. But I imagine that it doesn't, so in this case you probably don't need any quote marks at all.

*Note that there are certain situations where nested containers create separate interpretation contexts. i.e.:


echo "A nested command: $( cat "filename with spaces.txt" )."
echo "A parameter substitution (left hand side): ${var/'string$with`special|characters*'/replacement string}"

The internal sets of quotes are treated separately from the outer ones, but they still act as toggles inside their respective parsing environments.

Fnux 03-31-2013 11:38 PM

Thank you for all these precisions that solved my problem.

All the best.

All times are GMT -5. The time now is 01:30 AM.