52

I often see tutorials on the web or posts on this site which make heavy use of the following characters at the command line. Often it seems that they are used for pretty similar purposes. What are the differences between them when used on the command line or for shell programming? For what purpose do I use which of them?

" " double quotes

' ' single quotes

` ` backticks
0

6 Answers 6

51

For the sake of example, consider that variable foo contains uname (foo=uname).

  • echo "$foo" outputs uname, substituting variables in text.
    • For a literal $ character inside " quotes, use \$; for a literal ", use \".
  • echo '$foo' outputs $foo, the exact string.
    • Even ' can't be escaped as \' inside ' quotes. But you can use 'foo'\''bar'.
  • echo `$foo` outputs Linux, executing the content of the variable and echo printing it.
1
  • 1
    \ is always treated literally when enclosed in single quotes, even if it precedes a '. After an opening ', the next ' is always interpreted as the closing quote. Something like quoting for ' in a single-quoted string can be achieved by ending quoting, escaping ' individually, and starting quoting again. That is, while \' doesn't work between opening and closing ' characters, '\'' does. (See Gilles's correction to one of my posts when I'd made the same mistake for details.) Oct 15, 2014 at 20:04
11

This is explained very nicely in the relevant section of the bash manual. Briefly, anything within single quotes is interpreted literally. So, for example:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

Compare that to the unquoted versions:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

Double quotes allow variable expansion (also history expansion and some other things). Basically, you use them when you are dealing with something that you want to see expanded. For example:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

In other words, single quotes completely protect a string from the shell while double quotes protect some things (spaces for example) but allow variables and special characters to be expanded/interpreted correctly.

1
  • 1
    not sure if the OP was changed after the fact, but this answer does not mention backticks? Sep 11, 2018 at 23:29
7

Single quotes ('') are used to preserve the literal value of each character enclosed within the quotes.

Using double quotes (""), the literal value of all characters enclosed is preserved, except for the dollar sign ($), the backticks (backward single quotes, ``) and the backslash (\).

When enclosed inside back-ticks (``), the shell interprets something to mean "the output of the command inside the back-ticks." This is referred to as "command substitution", as the output of the command is substituted for the command itself.

references:

0
3
echo '$HOME' is "$HOME"

Single quotes prevent the variable expansion, while double quotes allow it.

2

Am just talking in general but:

"" - Used to process some info inside of them before output. (Like in PHP.)

  • For example: name=NESS; echo "Hello my name is $name" will output: Hello my name is NESS

'' - Used to show the output as it is. (Also like in PHP.)

  • Using the example above, it will output Hello my name is $name

So the difference between double and single quotes is that double quotes process the variable and show the value, while single quotes show the name of the variable without processing.

`` - Used to quote commands that are later assigned to another variable.

1

Single quotes enclose a value which is to be taken literally: all types of expansion are suppressed. Usually used if the value includes or may include white space (space, tab, new-line), or special characters ($, \ , ` ) that the user does not want to be expanded/treated specially by the shell.

Double quotes enclose a value which will have variables, and character replacement done. Required when the output may contain whitespace, and must be assigned as a single value.

Back quotes enclose a command, the results of which are wanted as value. Newer shells allow the use of $(...) in place of `...`. I prefer the newer method.

The following code may help understand what is happening.

CMD='ls .'
echo sq: $CMD
set $CMD
echo raw 1: $1
echo raw: $*
set "$CMD"
echo dq: $1
echo bq: `$CMD`
echo new: $($CMD)

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .