如何阻止此处字符串 (<<<) 添加换行符或换行符?
How can I stop a here string (<<<) from adding a line break or new lines?
好像是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
所以我们有 table:
| adds new line |
-------------------------|
printf | No |
echo -n | No |
echo | Yes |
<<< | Yes |
来自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.
作为 "here doc" 添加换行符:
$ string="hello test"
$ cat <<_test_ | xxd
> $string
> _test_
0000000: 6865 6c6c 6f20 7465 7374 0a hello test.
还有一个 "here string":
$ 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
显示 那以及为什么这里的字符串(以及这里的文档)总是附加一个换行符.
至于:
Is there a convenient way of removing it?
在 Bash 中,在 process substitution 中使用 printf
作为 "\n
-less" 替代 here-string:
... < <(printf %s ...)
应用于您的示例:
$ md5sum < <(printf %s 'test')
098f6bcd4621d373cade4e832627b4f6
或者,正如 user202729 所建议的那样,只需 在管道中使用 printf %s
,它的额外优势是不仅使用更熟悉的功能,而且还使命令在(更严格地)符合 POSIX 的 shell 中工作(在针对 /bin/sh
的脚本中):
$ printf %s 'test' | md5sum
098f6bcd4621d373cade4e832627b4f6
好像是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
所以我们有 table:
| adds new line |
-------------------------|
printf | No |
echo -n | No |
echo | Yes |
<<< | Yes |
来自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.
作为 "here doc" 添加换行符:
$ string="hello test"
$ cat <<_test_ | xxd
> $string
> _test_
0000000: 6865 6c6c 6f20 7465 7374 0a hello test.
还有一个 "here string":
$ 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
至于:
Is there a convenient way of removing it?
在 Bash 中,在 process substitution 中使用 printf
作为 "\n
-less" 替代 here-string:
... < <(printf %s ...)
应用于您的示例:
$ md5sum < <(printf %s 'test')
098f6bcd4621d373cade4e832627b4f6
或者,正如 user202729 所建议的那样,只需 在管道中使用 printf %s
,它的额外优势是不仅使用更熟悉的功能,而且还使命令在(更严格地)符合 POSIX 的 shell 中工作(在针对 /bin/sh
的脚本中):
$ printf %s 'test' | md5sum
098f6bcd4621d373cade4e832627b4f6