我试图for
在 shell 中使用空格来迭代文件名。我读了一个可以使用的stackoverflow问题,IFS=$'\n'
而且似乎工作正常。然后,我在评论中阅读了一个答案,以使其 posix 与 bash 以外的 shell 兼容,可以使用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 以换行符拆分时,为什么需要包含退格键?- 堆栈溢出
做那里讨论的事情有什么危险IFS=$(echo -en '\n\b')
吗?因为这增加了\b
IFS (我检查过)。可以\b
在文件名中出现吗?我不希望我的代码错误地拆分文件名。
另外,您对如何在for
循环后正确处理 IFS 恢复有任何建议吗?我应该将它存储在临时变量中,还是在子shell中运行 IFS 和 for 语句?(以及如何做到这一点?)谢谢