linux - 为什么 cat <<< $VAR1 会丢失换行符?

标签 linux bash

示例 1:从 shell 打印两行

$ cat <<< $'Line 1\nLine 2'
Line 1
Line 2

示例 2:不打印两行,为什么?

$ VAR1=$'Line 1\nLine 2'
$ cat <<< $VAR1
Line 1 Line 2

检查 VAR1 的值,看看它是否正是我设置的值:

set | grep VAR1

输出:

VAR1=$'Line1\nLine2'

那么,如果 VAR1 是我设置的,为什么变量扩展产生的结果与文字字符串不同 - \n 被替换为空格?

最佳答案

虽然 here 字符串中的参数扩展不应该 进行分词,但直到 bash 4.4 才真正做到这一点。扩展中的换行符被视为任意空格,在将结果传递到 cat 的标准输入之前,shell 将其替换为单个空格。

引用扩展保留 bash 早期版本中的文字换行符:

bash-4.3$ VAR1=$'Line 1\nLine 2'
bash-4.3$ cat <<< $VAR1
Line 1 Line 2
bash-4.3$ cat <<< "$VAR1"
Line 1
Line 2

但未加引号的扩展在 bash 4.4 中按预期工作:

bash-4.4$ VAR1=$'Line 1\nLine 2'
bash-4.4$ cat <<< $VAR1
Line 1
Line 2

关于linux - 为什么 cat <<< $VAR1 会丢失换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50137589/

相关文章:

c - 将套接字绑定(bind)到网络接口(interface)

Linux: proc/net/sockstat tcp mem 越来越大

c - 共享 V 内存系统调用的 shmflg 中的 0 标志是什么意思?

bash - VIM: chmod 命令不是编辑器命令

linux - nohup 和 & 在运行 bash 命令时有什么区别?

bash - 如何检查 bash 脚本是否正在运行并退出

linux - 有人能告诉我在 linux 内核源代码中维护运行进程的进程表/队列的位置吗?

bash - 如何根据行开头的日期过滤 bash 命令的输出行?

bash - awk大于小于但在设定范围内

c++ - 测量使用预编译库(C++、Linux)的程序的总 CPU 时间