将IFS设置为拆分换行符时,为什么需要包含退格键?

时间:2013-05-30 08:34:01

标签: linux bash

我很好奇为什么在设置IFS以拆分这样的换行符时需要退格:

IFS=$(echo -en "\n\b")

为什么我不能只使用它(这不起作用)呢?

IFS=$(echo -en "\n")

我正在使用Unix行结尾保存文件的Linux系统。我已经使用换行符将我的文件转换为十六进制,它肯定只使用“0a”作为换行符。

我已经搜索了很多内容,虽然许多页面都记录了换行符后面的换行符,但我找不到解释为什么需要退格键。

-David。

5 个答案:

答案 0 :(得分:102)

因为正如bash手册所说的关于command substitution

  

Bash通过执行命令并用命令的标准输出替换命令替换执行扩展,删除任何尾随换行符。

因此,通过添加\b,您可以阻止删除\n

更简洁的方法是使用$''引用,如下所示:

IFS=$'\n'

答案 1 :(得分:44)

我记得最简单的方法。 在debian wheezy上用bash进行测试。

IFS="
"

不开玩笑:)

答案 2 :(得分:9)

由于使用了echo和命令替换,这是一个黑客攻击。

prompt> x=$(echo -en "\n")
prompt> echo ${#x}
0
prompt> x=$(echo -en "\n\b")
prompt> echo ${#x}
2

$()条带尾随换行符和\b会阻止\n成为尾随换行符,同时极不可能出现在任何文本中。 IFS=$'\n'是设置IFS在换行符上拆分的更好方法。

答案 3 :(得分:3)

TypeError char作为换行符后缀\b的添加是由于删除了命令替换\n的尾部\n,因此$(...)被用作\b的后缀,并且\n不再尾随,因此从命令替换中返回。

副作用是\n还将具有IFS字符和分隔符,而不仅仅是唯一引起关注的\b

如果您期望\n有一天会出现在字符串中(为什么不出现),那么您可以使用:

\b

IFS="$(printf '\nx')" && IFS="${IFS%x}"; returns \n suffixed with x &&

现在IFS仅具有removes x字符。

\n

测试IFS="$(printf '\nx')" && IFS="${IFS%x}"; echo ${#IFS}; # 1 不会破坏任何东西,

\b

给出两行(由于#!/bin/sh sentence=$(printf "Foo\nBar\tBaz Maz\bTaz"); IFS="$(printf '\nx')" && IFS="${IFS%x}"; for entry in $sentence do printf "Entry: ${entry}.\n"; done 一行):

\n

符合预期。

代替Entry: Foo. Entry: Bar Baz Maz Taz. 使用:

IFS="$(printf '\nx')" && IFS="${IFS%x}";

给出相同的结果,但是不得缩进这两行,并且如果您不小心在“和”之间放置了空格或制表符或任何其他白色字符,您将不再在那里仅拥有IFS=" " 字符,而有些“奖金”以及 除非您使用选项在编辑器中显示所有字符,否则很难发现这一点。

答案 4 :(得分:1)

只需按下输入而不指定任何内容也可以。虽然,看起来有人犯了一个错误,很难理解。

IFS=
#This is a line