在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";