我很好奇为什么在设置IFS以拆分这样的换行符时需要退格:
IFS=$(echo -en "\n\b")
为什么我不能只使用它(这不起作用)呢?
IFS=$(echo -en "\n")
我正在使用Unix行结尾保存文件的Linux系统。我已经使用换行符将我的文件转换为十六进制,它肯定只使用“0a”作为换行符。
我已经搜索了很多内容,虽然许多页面都记录了换行符后面的换行符,但我找不到解释为什么需要退格键。
-David。
答案 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