When grep "\\" XXFile I got "Trailing Backslash"

bash, grep, linux, shell

Solution

The difference is in how the shell treats the backslashes:

When you write `"\\"` in double quotes, the shell interprets the backslash escape and ends up passing the string `\` to grep. Grep then sees a backslash with no following character, so it emits a "trailing backslash" warning. If you want to use double quotes you need to apply two levels of escaping, one for the shell and one for grep. The result: `"\\\\"`.

When you write `'\\'` in single quotes, the shell does not do any interpretation, which means grep receives the string `\\` with both backslashes intact. Grep interprets this as an escaped backslash, so it searches the file for a literal backslash character.

If that's not clear, we can use `echo` to see exactly what the shell is doing. `echo` doesn't do any backslash interpretation itself, so what it prints is what the shell passed to it.

$ echo "\\"
\
$ echo '\\'
\\

Problem

Now I want to find whether there are lines containing '\' character. I tried `grep "\\" XXFile` but it hints "Trailing Backslash". But when I tried `grep '\\' XXFile` it is OK. Could anyone explain why the first case cannot run? Thanks.

Original source