Why does double quotes affect the printing of these echo statements in linux? Why does double quotes affect the printing of these echo statements in linux? unix unix

Why does double quotes affect the printing of these echo statements in linux?


The effect comes from the shell. Without double quotes the shell replaces newlines, tabs and spaces with spaces. You can avoid this substitution with double quotes. See the section Word Splitting in the man page of bash(1) for more details:

Word Splitting

The shell scans the results of parameter expansion, command substitution, and arithmetic expansion that did not occur within double quotes for word splitting.

The shell treats each character of IFS as a delimiter, and splits the results of the other expansions into words on these characters. If IFS is unset, or its value is exactly , the default, then any sequence of IFS characters serves to delimit words. If IFS has a value other than the default, then sequences of the whitespace characters space and tab are ignored at the beginning and end of the word, as long as the whitespace character is in the value of IFS (an IFS whitespace character). Any character in IFS that is not IFS white- space, along with any adjacent IFS whitespace characters, delimits a field. A sequence of IFS whitespace characters is also treated as a delimiter. If the value of IFS is null, no word splitting occurs.

You can see the content of IFS with echo "$IFS" | xxd. It will show you

00000000: 2009 0a0a                                 ...

which means space (0x20), tab (0x09) and newline (0x0a). The second 0x0a comes from the echo command.

You can avoid this substitution by setting IFS to the empty string:

IFS=""echo "$current_processes"19984 1008917784

But I wouldn't recommend this.