我很好奇为什么在设置IFS以按换行符分割时需要使用退格键,就像这样:
IFS=$(echo -en "\n\b")
为什么我不能只使用这个(它不起作用)?
IFS=$(echo -en "\n")
我使用的是保存文本为Unix行结尾符的Linux系统。我已将我的带有换行符的文件转换为十六进制,并且它只使用“0a”作为换行符。
我进行了很多搜索,虽然有很多页面记录了换行符后跟退格键的解决方案,但我没有找到任何解释为什么需要使用退格键。
-David。
正如bash手册关于命令替换所述:
Bash通过执行命令并使用命令的标准输出来扩展命令替换,并删除任何尾随的换行符,从而执行扩展。
因此,通过添加\b
,可以防止\n
被删除。
更清晰的方法是使用$''
引用,像这样:
IFS=$'\n'
$'...'
旨在被包含在 POSIX 中。[http://mywiki.wooledge.org/Bashism] [http://austingroupbugs.net/view.php?id=249] - go2nullhost=$(mysql -S $socket $catalog --skip-column-names -e "select host from mysql.user); echo "Host: $host"; IFS=$'\n';read -ra hostArray <<< "$host"; echo "HostArray:$hostArray" #This prints only 1 item. But there are 4 items;
这里出了什么问题? - Guna我刚想起最简单的方法。在debian wheezy上使用bash测试过。
IFS="
"
别开玩笑 :)
IFS
更加困难呢? - Steve SummitoldIFS
",以避免任何陷阱。 - juanmirocks由于使用了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 设置为按换行符进行拆分。
\n\b
格式也将退格符作为IFS
分隔符,因此在某些情况下我认为它是有问题的。 - Tom HaleIFS="$(printf '\nx')" && IFS="${IFS%x}";
该函数返回带有字符 "x" 后缀的字符串,同时去除了字符 "x"。
现在 IFS 只包含字符 "\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="
"
两种写法会得到同样的结果,但这两行代码不能有缩进。如果你在双引号之间意外地输入了空格、制表符或其他任何空白字符,那么你将不仅有\n
字符,还有一些"额外奖励"。
这个错误很难发现,除非你使用编辑器中的“显示所有字符”选项。
printf
而不是echo
是强制性的,并且使用IFS=$(printf '\nx'); IFS=${IFS%?}
而不是IFS="
<literal newline>"
更加清晰,我个人认为。 - Fravadona只是按下回车键而不进行任何赋值也可以工作。虽然看起来像是有人犯了错误,难以理解。
IFS=
#This is a line
IFS=""
,而这不是所要求的。IFS=
创建一个零长度字符串,而 IFS=$'\n'
则创建了一个长度为1个字符的字符串。您可以使用 echo ${#IFS}
进行验证。 - Rich
for file in $(ls) ; do echo "$f" ; done
中,你需要重置IFS。如果不将IFS设置为仅换行符,则for循环将逐个输出每个文件名中的每个以空格分隔的块,而不是整个文件名。 - bleistift2X
设置为 "a",你只需要说X="a"
就行了;你不必说X=$(echo "a")
。更何况,在这里我们实际上正在设置 IFS 为某些会额外拆分退格符的东西,如果输入恰好包含它!如果问题是“为什么?”,那么你的回答是正确的,但如果问题是“设置IFS
为换行符的好方法是什么?”,我必须赞扬 moddie 的答案。 - Steve Summit