IFS用作分词字符,但是当IFS为空/空时究竟会发生什么。 例如,考虑输入文件 abc.txt 包含内容
first line
second line
现在,如果我运行
IFS='' # or IFS= or assume IFS is null
for word in $(cat abc.txt)
do
echo ${word}
done
然后输出为
first line
second line
注意,在输出中,显示了两行。 现在,问题是为什么出现两行而不是一行? 如果没有IFS用作分词字符,那么我想输出应该是
first line second line
输出不应该只在一行中,因为目前也不是IFS?
您已设置 IFS,但设置为空值。
假设您使用的是符合 POSIX 标准的外壳,如果 IFS 为空,则根据 IEEE Std 1003.1,2004(对 POSIX.1-2001 的次要更新)第 2.6.5 节字段拆分说:
如果 IFS 的值为空,则不执行字段拆分。
因此,您实际上不是在迭代这些行,只是在一次运行中打印所有内容。如果相关,请注意,取消设置IFS 将具有非常不同的行为(使其行为就像用默认值、空格/制表符/换行符填充一样)。
abc.txt
的全部内容在循环的第一次迭代中分配给word
,包括每行末尾的换行符。这些换行符是echo
参数的一部分,这会将它们写入标准输出。
您的循环只执行一次,单个调用echo
写入从文件中读取的两行。
(将declare -p word
添加到循环主体中,以查看唯一一次迭代中word
的完整值。