IFS用作分词字符,但当IFS为null/空时会发生什么情况。例如,考虑包含内容的输入文件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既然现在\n也不是IFS,那么输出不应该只在一行中吗?
发布于 2021-10-09 21:43:56
您设置了IFS,但设置为空值。
假设您使用的是POSIX兼容的shell,如果IFS为空,则按照IEEE标准1003.1,2004年(对POSIX.1-2001部分2.6.5 Field Splitting的次要更新如下所示:
如果IFS的值为空,则不进行字段拆分。
因此,您实际上不是在迭代各行,而只是在一次运行中打印所有内容。如果相关,请注意,取消设置IFS将具有非常不同的行为(使其行为如同填充了默认值、空格/制表符/换行符)。
发布于 2021-10-09 21:45:24
在循环的第一次迭代中,abc.txt的全部内容被分配给word,包括每行末尾的换行。这些换行符是echo参数的一部分,它将它们写入标准输出。
您的循环只执行一次,对echo的单个调用将写入从文件读取的两行代码。
(将declare -p word添加到循环体,以查看word在一次且唯一的迭代中的完整值。)
https://stackoverflow.com/questions/69510734
复制相似问题