我很好奇为什么在设置IFS以分割这样的换行符时需要退格:
IFS=$(echo -en "\n\b")
Run Code Online (Sandbox Code Playgroud)
为什么我不能只使用它(这不起作用)呢?
IFS=$(echo -en "\n")
Run Code Online (Sandbox Code Playgroud)
我正在使用Unix行结尾保存文件的Linux系统上.我已经使用换行符将我的文件转换为十六进制,它肯定只使用"0a"作为换行符.
我已经google了很多,虽然许多页面都记录了换行符后面的换行符,但我找不到解释为什么需要退格键.
-大卫.
spb*_*ick 108
因为正如bash手册所说的关于命令替换:
Bash通过执行命令并用命令的标准输出替换命令替换来执行扩展,删除任何尾随换行符.
所以,通过添加\b你防止删除\n.
更简洁的方法是使用$''引用,如下所示:
IFS=$'\n'
Run Code Online (Sandbox Code Playgroud)
小智 47
我记得最简单的方法.在debian wheezy上用bash测试.
IFS="
"
Run Code Online (Sandbox Code Playgroud)
不开玩笑:)
Jim*_*mix 10
由于删除了命令替换中的尾部,因此添加了\b作为换行符后缀的char 。因此, the被用作 的后缀,并且它不再尾随,因此它是从命令替换中返回的。\n\n$(...)\b\n\n
副作用是,它IFS还将包括\bchar 作为分隔符,而不仅仅是\n,这确实是我们唯一的兴趣。
如果您期望\b有一天可能出现在字符串中(为什么不呢?),那么您可以使用:
IFS="$(printf '\nx')" && IFS="${IFS%x}";
Run Code Online (Sandbox Code Playgroud)
那returns \n suffixed with x && removes x
现在 IFS 仅包含\nchar。
IFS="$(printf '\nx')" && IFS="${IFS%x}";
echo ${#IFS}; # 1
Run Code Online (Sandbox Code Playgroud)
并且在 , 测试的情况下不会破坏任何内容\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
Run Code Online (Sandbox Code Playgroud)
给出两行(由于 1 \n):
Entry: Foo.
Entry: Bar Baz Maz Taz.
Run Code Online (Sandbox Code Playgroud)
正如预期的那样。
IFS="$(printf '\nx')" && IFS="${IFS%x}";使用:
IFS="
"
Run Code Online (Sandbox Code Playgroud)
给出相同的结果,但是这两行不能缩进,如果您不小心在“和”之间放置了空格或制表符或任何其他白色字符,那么您将不再只有字符\n,还有一些“奖励” 。除非您在编辑器中使用“显示所有字符”选项,否则很难发现此错误。
这是一个黑客,因为使用echo和命令替换.
prompt> x=$(echo -en "\n")
prompt> echo ${#x}
0
prompt> x=$(echo -en "\n\b")
prompt> echo ${#x}
2
Run Code Online (Sandbox Code Playgroud)
所述$()条带后新行和\b防止\n从被,同时非常不可能出现在任何文本尾随换行符.IFS=$'\n'是设置IFS在换行符上拆分的更好方法.
| 归档时间: |
|
| 查看次数: |
71192 次 |
| 最近记录: |