bash echo在没有文件名的bashvariables中给出的文件行数
我有一个bash脚本中的以下三个构造:
NUMOFLINES=$(wc -l $JAVA_TAGS_FILE) echo $NUMOFLINES" lines" echo $(wc -l $JAVA_TAGS_FILE)" lines" echo "$(wc -l $JAVA_TAGS_FILE) lines" 当脚本运行时,它们都会产生相同的输出:
 121711 /home/slash/.java_base.tag lines 121711 /home/slash/.java_base.tag lines 121711 /home/slash/.java_base.tag lines 
即文件的名称也回声(我不想)。 为什么这些脚本失败,我应该如何输出一个干净的:
 121711 lines 
?
一个使用自己的数据的例子
您可以通过使用来自JAVA_TAGS_FILE的redirect来避免将文件名embedded到NUMOFLINESvariables中,而不是将文件名作为parameter passing给wc 。 例如:
 NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE") 
说明:使用pipe道或redirect来避免输出中的文件名
如果input来自pipe道或redirect操作符,则wc实用程序将不会在其输出中显示文件的名称。 考虑这些不同的例子:
 # wc shows filename when the file is an argument $ wc -l /etc/passwd 41 /etc/passwd # filename is ignored when piped in on standard input $ cat /etc/passwd | wc -l 41 # unusual redirection, but wc still ignores the filename $ < /etc/passwd wc -l 41 # typical redirection, taking standard input from a file $ wc -l < /etc/passwd 41 
正如你所看到的,唯一的时间wc将打印文件名是当它作为parameter passing,而不是标准input数据。 在某些情况下,您可能需要打印文件名,所以了解何时会显示它是有用的。
 如果你不给它, wc就不能得到文件名。 
 wc -l < "$JAVA_TAGS_FILE" 
你也可以使用awk:
 awk 'END {print NR,"lines"}' filename 
要么
 awk 'END {print NR}' filename 
这是一个非常简单的:
 NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l ) 
要么
 NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}') 
(适用于Mac,可能还有其他的Unix)
实际上,wc方法存在一个问题:如果它不是以行结尾符号结束,则不会计算最后一行。
改用这个
 nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs) 
甚至更好(谢谢gniourf_gniourf):
 nblines=$(grep -c '' file.txt) 
注意:chilicuil的awk方法也适用。
我通常使用bash的“back tick”function
 export NUM_LINES=`wc -l filename` 
注意'剔'是'后退',例如`不是正常的单引号