Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I stop a here string (<<<) from adding a line break or new lines?

It seems that here string is adding line break. Is there a convenient way of removing it?

$ string='test'
$ echo -n $string | md5sum
098f6bcd4621d373cade4e832627b4f6  -
$ echo $string | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -
$ md5sum <<<"$string"
d8e8fca2dc0f896fd7cb4cb0031ba249  -
like image 483
NarūnasK Avatar asked Jun 09 '16 14:06

NarūnasK


People also ask

How do you break a line through a string?

In Windows, a new line is denoted using “\r\n”, sometimes called a Carriage Return and Line Feed, or CRLF. Adding a new line in Java is as simple as including “\n” , “\r”, or “\r\n” at the end of our string.

How do I create a new line in bash?

Printing Newline in Bash The most common way is to use the echo command. However, the printf command also works fine. Using the backslash character for newline “\n” is the conventional way. However, it's also possible to denote newlines using the “$” sign.


2 Answers

Yes, you are right: <<< adds a trailing new line.

You can see it with:

$ cat - <<< "hello" | od -c
0000000   h   e   l   l   o  \n
0000006

Let's compare this with the other approaches:

$ echo "hello" | od -c
0000000   h   e   l   l   o  \n
0000006
$ echo -n "hello" | od -c
0000000   h   e   l   l   o
0000005
$ printf "hello" | od -c
0000000   h   e   l   l   o
0000005

So we have the table:

         | adds new line |
-------------------------|
printf   |      No       |
echo -n  |      No       |
echo     |      Yes      |
<<<      |      Yes      |

From Why does a bash here-string add a trailing newline char?:

Most commands expect text input. In the unix world, a text file consists of a sequence of lines, each ending in a newline. So in most cases a final newline is required. An especially common case is to grab the output of a command with a command susbtitution, process it in some way, then pass it to another command. The command substitution strips final newlines; <<< puts one back.

like image 84
fedorqui 'SO stop harming' Avatar answered Oct 21 '22 17:10

fedorqui 'SO stop harming'


fedorqui's helpful answer shows that and why here-strings (and also here-documents) invariably append a newline.

As for:

Is there a convenient way of removing it?

In Bash, use printf inside a process substitution as an "\n-less" alternative to a here-string:

... < <(printf %s ...)

Applied to your example:

$ md5sum < <(printf %s 'test')
098f6bcd4621d373cade4e832627b4f6

Alternatively, as user202729 suggests, simply use printf %s in the pipeline, which has the added advantage of not only using a more familiar feature but also making the command work in (more strictly) POSIX-compliant shells (in scripts targeting /bin/sh):

$ printf %s 'test' | md5sum
098f6bcd4621d373cade4e832627b4f6
like image 45
mklement0 Avatar answered Oct 21 '22 18:10

mklement0