Bash for 循环-如何包含空白换行符?(IFS)

Bash for 循环-如何包含空白换行符?(IFS)

请注意这是伪代码,我并不是想通过这种方式来计算行数,这个问题是为了弄清楚如何在 for 循环中包含完全空白的换行符。

cat file

word



word

因为总共有 5 行,所以 x 最后应该等于 5。

IFS=$'\n'
x=0
for line in $(cat file) ; do
x=$(($x+1))
done

echo $x

但是,空白换行符不被计算,并且 x 等于 2 而不是 5。

我以为IFS=$'\n'这会按照我想要的方式工作。有人能解释一下如何在 for 循环中“计算”空白换行符吗?

答案1

您不能使用 shell 的字段拆分来执行此操作。

相邻的空白字符IFS会一起解析,因此您无法使用字段拆分来区分相邻的空白 IFS 字符。从标准 (Shell 和实用程序第 2.6.5 节):

输入中每个出现的非 IFS 空格的 IFS 字符以及任何相邻的 IFS 空格应界定一个字段,如前所述。

事实就是这样。

由于这是一个假设性问题,而且您还没有说明您到底在做什么,所以我不会建议其他方法。

答案2

我认为你需要使用while read line

x=0
while read line ; do
    x=$(($x+1))
done

答案3

您可以使用循环而不是循环来执行readwhile操作for

#!/bin/bash
while read line; do
    ((x++))
done < file
echo $x
exit 0
~$ cat file
word



word
~$ bash script.sh
5

相关内容