IFS= 或 IFS= 是什么意思?



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的完整值。

最新更新