在bash中,如何计算variables中的行数?

我有一个存储在其中的string,需要检查它是否有线:

var=`ls "$sdir" | grep "$input"` 

伪代码:

 while [ ! $var's number of lines -eq 1 ] do something 

多数民众赞成我的想法如何检查, echo $var | wc -l echo $var | wc -l不起作用,它总是说1,即使它有3

echo -e不起作用

行情很重要。

 echo "$var" | wc -l 

这里公布的答案和其他答案在空variables(未定义或空string)的情况下不起作用。

这工作:

 echo -n "$VARIABLE" | grep -c '^' 

例如:

 ZERO= ONE="just one line" TWO="first > second" echo -n "$ZERO" | grep -c '^' 0 echo -n "$ONE" | grep -c '^' 1 echo -n "$TWO" | grep -c '^' 2 

另一种使用这里string

 wc -l <<< "$var" 

正如在这个注释中提到的,一个空的$var将导致1行而不是0行,因为这里string在这种情况下添加一个换行符( 解释 )。

你可以把“wc -l”replace成“wc -w”,而不是把行数换成字数。 这将不会计算任何新行,可用于testing您的原始结果是否为空,然后再继续。

如果grep没有返回任何结果,那么排在最前面的答案就会失败。

 Homer Simpson Marge Simpson Bart Simpson Lisa Simpson Ned Flanders Rod Flanders Todd Flanders Moe Szyslak 

这是做错的方法 :

 wiggums=$(grep -iF "Wiggum" characters.txt); num_wiggums=$(echo "$wiggums" | wc -l); echo "There are ${num_wiggums} here!"; 

会有告诉我们,名单上有1 Wiggum ,即使没有。

相反,你需要做一个额外的检查,看看variables是否为空( -z ,如“是零”)。 如果grep没有返回任何东西,variables将是空的。

 matches=$(grep -iF "VanHouten" characters.txt); if [ -z "$matches" ]; then num_matches=0; else num_matches=$(echo "$matches" | wc -l); fi echo "There are ${num_matches} VanHoutens on the list";