在bash中,IFS=和IFS=$'\n'有什么区别

bal*_*ton 7 bash read

bash中这三个代码块有什么区别吗?

使用IFS=

#!/usr/bin/env bash
while IFS= read -r item; do
    echo "[$item]"
done </dev/stdin
Run Code Online (Sandbox Code Playgroud)

使用IFS=$'\n'

#!/usr/bin/env bash
while IFS=$'\n' read -r item; do
    echo "[$item]"
done </dev/stdin
Run Code Online (Sandbox Code Playgroud)

使用-d $'\n'

#!/usr/bin/env bash
while read -rd $'\n' item; do
    echo "[$item]"
done </dev/stdin
Run Code Online (Sandbox Code Playgroud)

IFS如果两个值和分隔符选项之间存在差异-d,那么在什么情况下会出现差异?

根据我的测试,它们看起来都是一样的:

echo $'one two\nthree\tfour' | test-stdin 
# outputs:
# [one two]
# [three    four]
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 11

IFS=和是相同的(假设IFS=$'\n'分隔符没有从默认值更改),因为唯一的区别是行内的换行符是否分隔单词,但换行符永远不会出现在行内。readread

readread -d $'\n'是相同的,因为$'\n'(换行符) 是默认分隔符。

IFS=并对IFS=$'\n'字段分割产生影响:IFS=完全关闭字段分割,而IFS=$'\n'在换行符上分割。

IFS=$'\n'
echo $(echo a; echo b)
# prints "a b" on a single line since $'a\nb' is split at 
# the newline and therefore echo receives two arguments "a" and "b"
IFS=
echo $(echo a; echo b)
# prints "a" and "b" on separate lines $'a\nb' is passed 
# as a single argument to echo
Run Code Online (Sandbox Code Playgroud)