似乎Bash将LF转换为LFCR。实际上,这是一个描述以下内容的示例:
text=$(echo -e "foo\nbar\ntir")
将IFS设置为LF行尾时:
IFS=$(echo -e "\n")
字符串\n
中的text
未被解释为如下:
for w in $text ; do echo ${w}';' ; done
输出:
foo
bar
tir;
这里的字符“;”用作标记表示$text
只包含一个元素,因此虽然将\n
设置为IFS,但不会解释IFS=$(echo -e "\n\r")
。
但是现在,在将IFS设置为LFCR行尾时:
foo;
bar;
tir;
上一个命令的输出变为:
$text
标记“;”表明\n
包含三个元素,因此$text
中的\n\r
被解释为glue
(LFCR)设置为IFS。
那么,为什么Bash似乎将LF转换为LFCR?如果没有,那么基本的解释是什么?
答案 0 :(得分:3)
$IFS
实际上被设置为空字符串。
$ IFS=$(echo -e "\n")
$ echo "[$IFS]"
[]
当$(...)
捕获输出时,它会删除尾随换行符。您可以使用$IFS
shell语法将$'...'
设置为换行符,该语法解释转义序列,同时避免修剪问题。
$ IFS=$'\n'
$ echo "[$IFS]"
[
]
$ text=$'foo\nbar\nbaz\n'
$ printf '%s;\n' $text
foo;
bar;
baz;