为什么cat<<< $ VAR1输掉换行符?

时间:2018-05-02 14:52:46

标签: 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被空格替换?

1 个答案:

答案 0 :(得分:1)

虽然此处字符串中的参数扩展不是假设进行分词,但在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