似乎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;