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
read和read -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)