这里字符串添加换行符

Nar*_*asK 10 bash herestring

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

$ string='test'
$ echo -n $string | md5sum
098f6bcd4621d373cade4e832627b4f6  -
$ echo $string | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249  -
$ md5sum <<<"$string"
d8e8fca2dc0f896fd7cb4cb0031ba249  -
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 13

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

你可以看到它:

$ cat - <<< "hello" | od -c
0000000   h   e   l   l   o  \n
0000006
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

所以我们有桌子:

         | adds new line |
-------------------------|
printf   |      No       |
echo -n  |      No       |
echo     |      Yes      |
<<<      |      Yes      |
Run Code Online (Sandbox Code Playgroud)

什么bash here-string添加一个尾随的换行符?:

大多数命令都希望输入文本 在unix世界中,文本文件由一系列行组成,每行以换行符结尾.因此,在大多数情况下,需要最终换行.一个特别常见的情况是使用命令susbtitution获取命令的输出,以某种方式处理它,然后将其传递给另一个命令.命令替换剥离最终换行符; <<<把一个放回去.

  • 另请注意,here-string是单行此处文档的快捷方式,该文档始终以换行符结尾. (3认同)

mkl*_*nt0 6

fedorqui 的有用答案表明了这一点以及为什么here-strings(以及here-documents)总是附加一个换行符

至于:

有没有方便的去除方法?

printf在 Bash 中,在进程内部使用替换作为here-string 的\n -less”替代:

... < <(printf %s ...)
Run Code Online (Sandbox Code Playgroud)

应用于您的示例:

$ md5sum < <(printf %s 'test')
098f6bcd4621d373cade4e832627b4f6
Run Code Online (Sandbox Code Playgroud)

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

$ printf %s 'test' | md5sum
098f6bcd4621d373cade4e832627b4f6
Run Code Online (Sandbox Code Playgroud)