似乎here string
正在添加换行符。有没有方便的方法来删除它?
$ string='test'
$ echo -n $string | md5sum
098f6bcd4621d373cade4e832627b4f6 -
$ echo $string | md5sum
d8e8fca2dc0f896fd7cb4cb0031ba249 -
$ md5sum <<<"$string"
d8e8fca2dc0f896fd7cb4cb0031ba249 -
是的,你是对的:<<<
添加一个尾随的新行。
您可以通过以下方式查看它:
$ 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 在这里字符串添加一个尾随换行符?
大多数命令需要文本输入。在 unix 世界中,文本文件 由一系列行组成,每行以 换行符。 因此,在大多数情况下,需要最后一个换行符。一个特别常见的 案例是使用命令 susbtitution 抓取命令的输出, 以某种方式处理它,然后将其传递给另一个命令。命令 替换条最后换行符;
<<<
把一个放回去。
Fedorqui 的有用答案表明了这一点,以及为什么这里字符串(以及这里文档)总是附加换行符。
至于:
有没有方便的方法来删除它?
在 Bash 中,在进程替换中使用 printf
作为 here-string 的"无n
"替代:
... < <(printf %s ...)
应用于您的示例:
$ md5sum < <(printf %s 'test')
098f6bcd4621d373cade4e832627b4f6
或者,正如 user202729 所建议的那样,只需在管道中使用 printf %s
,这不仅具有使用更熟悉的功能,而且还使命令在(更严格地)符合 POSIX 的 shell 中工作(在面向 /bin/sh
的脚本中):
$ printf %s 'test' | md5sum
098f6bcd4621d373cade4e832627b4f6
作为"此处文档"添加换行符:
$ 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