我很好奇为什么将IFS设置为在换行符上拆分时为什么需要退格键:
IFS=$(echo -en "\n\b")
为什么我不能只使用它(不起作用)呢?
IFS=$(echo -en "\n")
我在使用Unix行尾保存文件的Linux系统上。我已经用换行符将文件转换为十六进制,并且肯定只使用“ 0a”作为换行符。
我已经在Google上搜索了很多,尽管有很多页面记录了换行符和后退解决方案,但是我发现却没有一个解释为什么需要退格。
-大卫。
我很好奇为什么将IFS设置为在换行符上拆分时为什么需要退格键:
IFS=$(echo -en "\n\b")
为什么我不能只使用它(不起作用)呢?
IFS=$(echo -en "\n")
我在使用Unix行尾保存文件的Linux系统上。我已经用换行符将文件转换为十六进制,并且肯定只使用“ 0a”作为换行符。
我已经在Google上搜索了很多,尽管有很多页面记录了换行符和后退解决方案,但是我发现却没有一个解释为什么需要退格。
-大卫。
for file in $(ls) ; do echo "$f" ; done
。如果不将IFS设置为仅换行符,则for循环将单独回显每个文件名中每个以空格分隔的块,而不是整个文件名。
Answers:
因为如bash手册所述,关于命令替换:
Bash通过执行命令并将命令替换替换为命令的标准输出来执行扩展,并删除所有尾随的换行符。
因此,通过添加\b
您可以防止删除\n
。
一种更干净的方法是使用$''
引号,如下所示:
IFS=$'\n'
host=$(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;
怎么了
我只记得最简单的方法。在debian wheezy上用bash测试。
IFS="
"
不开玩笑:)
\b
\n
由于删除\n
了命令替换$(...)
的尾部,因此添加了char作为换行符的后缀,因此将\b
用作后缀,\n
并且\n
不再作为尾随,因此从命令替换中返回它。
唯一的好处是,副作用IFS
还包括\b
字符和分隔符,而不仅仅是字符\n
。
如果您希望\b
某天在字符串中发生(为什么不发生),则可以使用:
IFS="$(printf '\nx')" && IFS="${IFS%x}";
那 returns \n suffixed with x
&&
removes 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
字符,而是拥有一些“奖励”,那将很难点,除非您使用选项在编辑器中显示所有字符。
仅按Enter键而不分配任何内容也可以。虽然,看起来有人犯了一个错误并且很难理解。
IFS=
#This is a line