String 如何计算bash变量中的行数,并考虑空值?

String 如何计算bash变量中的行数,并考虑空值?,string,bash,is-empty,line-count,String,Bash,Is Empty,Line Count,我们知道。然而,正如在评论和答案中所指出的,当涉及到空变量时,语义是奇怪的,因为空变量通常与非空、无换行符的变量计数相同: $ echo -n "" | wc -l 0 $ echo -n "foo" | wc -l 0 $ echo "" | wc -l 1 $ echo "foo" | wc -l 1 不太好,如果要计算其他命令返回的结果数 现在,在该问题的一个答案中建议了部分解决方法: printf "%s" "$a" | grep -c "^" 但这也不是我想要的,因为它将一个值为换

我们知道。然而,正如在评论和答案中所指出的,当涉及到空变量时,语义是奇怪的,因为空变量通常与非空、无换行符的变量计数相同:

$ echo -n "" | wc -l
0
$ echo -n "foo" | wc -l
0
$ echo "" | wc -l
1
$ echo "foo" | wc -l
1
不太好,如果要计算其他命令返回的结果数

现在,在该问题的一个答案中建议了部分解决方法:

printf "%s" "$a" | grep -c "^"
但这也不是我想要的,因为它将一个值为换行符的非空变量计算为0行


我的问题:除了“定期”计数,然后明确检查是否为空之外,在bash中是否有一种合适的方法来获得这样的计数?

以下将计算换行数:

printf%s“$var”| tr-d-c'\n'| wc-c
除了最后一行缺少换行符外,它在所有情况下都有效


如果变量为空,则可以单独进行测试,如下所示:

test-z“$var”和&echo“var为空”
测试-n“$var”和&echo“var不为空”

awk
救援:

$ echo -n "foo" | awk 'END {print NR}'
1
$ echo -n "" | awk 'END {print NR}'
0

“它将一个包含换行符的非空变量计算为0行”——是吗?这个
printf“%s”$'x\n'|grep-c“^”
为我返回
1
。@BenjaminW:我的意思是只保留一行新行,不保留其他内容。你想在第一行之后计算空行吗?
printf“a\n\n\n\nb\n”|countcommand
和数据不以换行符结尾的结果应该是什么:
printf“a\nb”
printf“a\n”
?@WalterA:假设是某个shell实用程序生成了该输出。通常情况下,它们会在结束时换行一行,提示您联机开始。所以,
a\n\n\n\nb\n
应该给5,我想;最后一个没有
\n
的空行将不计算在内
a\nb
-两行,但我不太可能得到输入<代码>一行\n-一行。另外,请参见edit。看起来是最健壮的解决方案,即使awk有点像一把大锤子。