请注意这是伪代码,我并不是想通过这种方式来计算行数,这个问题是为了弄清楚如何在 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
您可以使用循环而不是循环来执行read
此while
操作for
:
#!/bin/bash
while read line; do
((x++))
done < file
echo $x
exit 0
~$ cat file
word
word
~$ bash script.sh
5