Search code examples
terminalescapingdouble-quotes

How do I escape an ! so terminal sees a closing dquote for echo "Hello World!"


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!

  1. How do you escape an !?
  2. Why are double quotes different than single quotes here?

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.


Solution

  • 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:

    3.1.2.2 Single Quotes

    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.

    3.1.2.3 Double Quotes

    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).