16

似乎here string正在添加换行符。有没有方便的删除方法?

$ string='test'
$ echo -n $string | md5sum
098f6bcd4621d373cade4e832627b4f6  -
$ echo $string | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -
$ md5sum <<<"$string"
d8e8fca2dc0f896fd7cb4cb0031ba249  -
4

3 回答 3

21

是的,你是对的:<<<添加一个尾随的新行。

你可以看到它:

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

让我们将其与其他方法进行比较:

$ 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

所以我们有一张桌子:

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

为什么 bash here-string 添加尾随换行符?

大多数命令需要文本输入。在 unix 世界中,文本文件由一系列行组成,每行都以换行符结尾。所以在大多数情况下,需要最后一个换行符。一个特别常见的情况是使用命令替代获取命令的输出,以某种方式对其进行处理,然后将其传递给另一个命令。命令替换去掉最后的换行符;<<<放一个回来。

于 2016-06-09T14:35:05.140 回答
3

fedorqui 的有用答案表明,以及为什么 here-strings(以及 here-documents)总是附加一个 newline

至于:

有没有方便的删除方法?

在 Bash 中,printf进程替换中使用\n-less”替代 here-string

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

应用于您的示例:

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

或者,正如user202729建议的那样,只需在 pipeline 中使用printf %s,它的额外优势不仅在于使用更熟悉的功能,而且还可以使命令在(更严格地)符合 POSIX 的 shell 中工作(在脚本目标中/bin/sh):

$ printf %s 'test' | md5sum
098f6bcd4621d373cade4e832627b4f6
于 2016-06-10T23:07:45.067 回答
1

作为“here doc”添加换行符:

$ string="hello test"
$ cat <<_test_ | xxd
> $string
> _test_
0000000: 6865 6c6c 6f20 7465 7374 0a              hello test.

还有一个“这里的字符串”:

$ cat <<<"$string" | xxd
0000000: 6865 6c6c 6f20 7465 7374 0a              hello test.

在换行符上获取字符串非结尾的最简单的解决方案可能是printf

$ printf '%s' "$string" | xxd
0000000: 6865 6c6c 6f20 7465 7374                 hello test
于 2016-06-10T22:21:34.453 回答