How to avoid a series of backslashes in bash printf?

The following script gave an unexpected result:

printf "escaped slash: \\ \n" printf "2 escaped slashes: \\\\ \n" printf "3 escaped slashes: \\\\\\ \n" printf "4 escaped slashes: \\\\\\\\ \n" 

Run as a bash script in Ubuntu 14, I see:

 escaped slash: \ 2 escaped slashes: \ 3 escaped slashes: \\ 4 escaped slashes: \\ 

Err .. what?

+7
string bash escaping backslash
source share
2 answers

Assuming the printf FORMAT string is surrounded by double quotes, printf takes up one additional extension level compared to, for example, echo (both are shell commands).

What you expect from printf can be achieved with single quotes:

 printf '1 escaped slash: \\ \n' printf '2 escaped slashes: \\\\ \n' printf '3 escaped slashes: \\\\\\ \n' printf '4 escaped slashes: \\\\\\\\ \n' 

outputs:

 1 escaped slash: \ 2 escaped slashes: \\ 3 escaped slashes: \\\ 4 escaped slashes: \\\\ 
+4
source share

printf is a built-in bash. See help printf :

  printf [-v var] format [arguments]
       Formats and prints ARGUMENTS under control of the FORMAT.

You must pass a format and an argument. Therefore, add the format "%s\n" before the argument:

 printf "%s\n" "escaped slash: \\" printf "%s\n" "2 escaped slashes: \\\\" printf "%s\n" "3 escaped slashes: \\\\\\" printf "%s\n" "4 escaped slashes: \\\\\\\\" 

Output:

  escaped slash: \ 
 2 escaped slashes: \\ 
 3 escaped slashes: \\\ 
 4 escaped slashes: \\\\ 
+3
source share

All Articles