我试图在shell中使用
前者有效,但后者无效。该评论已获得数次赞同。我检查了输出和变量似乎不包含换行符。
输出显示第一个字段缺少字段分隔符:
但是在第二个上是正确的:
for
循环遍历带有空格的文件名。我在一个stackoverflow问题中读到IFS=$'\n'
可以使用,这似乎很有效。然后我在答案的评论中读到,为了使它在bash之外的shell中具有posix兼容性,可以使用IFS=$(echo -e '\n')
。前者有效,但后者无效。该评论已获得数次赞同。我检查了输出和变量似乎不包含换行符。
#!/bin/sh
IFS=$(echo -e '\n')
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
echo
IFS=$'\n'
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
输出显示第一个字段缺少字段分隔符:
0000000
Found one
two two
three
但是在第二个上是正确的:
0000000 0a
0000001
Found one
Found two two
Found three
我找到了一个已解答的问题,它可能是我的问题的重复:
linux - 当设置 IFS 以按换行符拆分时,为什么需要包含退格符?- Stack Overflow
那样做有没有任何风险,IFS=$(echo -en '\n\b')
?因为这会给 IFS 添加一个 \b
(我已经检查过了)。文件名中是否可能出现 \b
?我不想让代码错误地拆分文件名。
另外,您有没有关于如何正确处理 for
循环之后 IFS 的恢复的建议?我应该将其存储在临时变量中,还是在子 shell 中运行 IFS 和 for 语句?(如何实现?)谢谢
IFS="$(printf '\n+')"
$ echo -n "$IFS" | xxd
00000000: 0a2b
<- 这也将+
添加到 IFS 中。 - Tom Hale