Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am capturing output from ps aux:

current_processes=`ps aux | grep "tempdir" | tail -3`

and when I echo it, it looks like this

echo $current_processes
19984 10089 17784

and when I echo plus double quote it, it looks like this:

echo "$current_processes"
19984 
10089
17784    

Why does it put these on new lines when I use double quotes but not in the absence of double quotes?

like image 909
makansij Avatar asked Sep 07 '17 01:09

makansij


People also ask

What is the difference between single quotes and double quotes in Linux?

Single quotes and double quotes are both functional in Linux while working with shell scripts or executing commands directly in the terminal but there is a difference between the way the bash shell interprets them. Enclosing characters in single quotation marks (‘) holds onto the literal value of each character within the quotes.

How do I echo a quote in a shell script?

Your shell is interpreting the quotes, both ' and ", before they even get to echo. I generally just put double quotes around my argument to echo even if they're unnecessary; for example: So in your first example, if you want to include literal quote marks in your output, they either need to be escaped:

What is the use of Echo in Linux?

Echo is a simple command that simply prints its arguments on the display. abhishek@linuxhandbook:~$ echo Hello World Hello World You can guess why this command is called ‘echo’. Like the sound echo, the command also simply prints what it receives in the input.

Is it possible to double quote a command in shell script?

You can also double-quote it, but then you'll need to escape the $ s so the shell doesn't resolve them as variables, and the backticks so the shell doesn't run the command substitution right away: I'm not going to go into much detail on why your attempts behave the way they do, because Michael Mrozek's answer covers this well.


1 Answers

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 
10089
17784

But I wouldn't recommend this.

like image 143
clemens Avatar answered Nov 09 '22 18:11

clemens