The problem:
By typing, echo "Hello World!"
, into the terminal I'm am answered with: dquote>
The Question (2-parts):
If I use single quotes, terminal returns the result that I'm expecting to see: Hello World!
!
? I have tried:
Using backslash, echo "Hello World/!"
doesn't seem to work, I'm still returned dquote>
.
I've also tried looking for other answers on escape characters and stackoverflow answers. They usually end up going over my head.
About question 1: (How do you escape an !
?)
You can use "'!'"
Example:
echo "Hello World"'!'""'!'" I'm there."
Result:
Hello World!! I'm there.
About question 2: (Why are double quotes different than single quotes here?)
Because !
is the default "history expansion" character and inside double quotes "history expansion" is performed.
Bash manual:
Enclosing characters in single quotes (
'
) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.Enclosing characters in double quotes (
"
) preserves the literal value of all characters within the quotes, with the exception of$
,`
,\
, and, when history expansion is enabled,!
. The characters$
and`
retain their special meaning within double quotes (see Shell Expansions). The backslash retains its special meaning only when followed by one of the following characters:$
,`
,"
,\
, or newline. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an!
appearing in double quotes is escaped using a backslash. The backslash preceding the!
is not removed.The special parameters
*
and@
have special meaning when in double quotes (see Shell Parameter Expansion).