Bash似乎将LF转换为LFCR



似乎Bash将LF转换为LFCR。事实上,这里有一个下面描述的例子:

text=$(echo -e "foonbarntir")

将 IFS 设置为线路末端时:

IFS=$(echo -e "n")

字符串text中的n不会被解释,例如 bellow:

for w in $text ; do echo ${w}';' ; done

输出:

foo
bar
tir;

此处用作标记的字符 ";" 表示$text仅包含一个元素,因此尽管n设置为 IFS,但不会对其进行解释。

但是现在,当将IFS设置为LFCR线端时:

IFS=$(echo -e "nr")

上一个命令的输出变为:

foo;
bar;
tir;

标记 ";" 表示$text包含三个元素,因此n$text被解释为 IFS 的nr(LFCR(。

那么,为什么 Bash 似乎将 LF 转换为 LFCR?如果没有,请问潜在的解释是什么?

$IFS实际上被设置为空字符串。

$ IFS=$(echo -e "n")
$ echo "[$IFS]"
[]

$(...)捕获输出时,它会删除尾随换行符。可以使用$'...'、shell 语法将$IFS设置为换行符,该语法解释转义序列,同时避免修整问题。

$ IFS=$'n'
$ echo "[$IFS]"
[
]
$ text=$'foonbarnbazn'
$ printf '%s;n' $text
foo;
bar;
baz;

最新更新