我在bash脚本中有以下三个结构:
NUMOFLINES=$(wc -l $JAVA_TAGS_FILE)
echo $NUMOFLINES" lines"
echo $(wc -l $JAVA_TAGS_FILE)" lines"
echo "$(wc -l $JAVA_TAGS_FILE) lines"
Run Code Online (Sandbox Code Playgroud)
并且在脚本运行时它们都产生相同的输出:
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
Run Code Online (Sandbox Code Playgroud)
即文件名也被回显(我不想这样).为什么这些scriplet会失败,我应该如何输出干净:
121711 lines
Run Code Online (Sandbox Code Playgroud)
?
Tod*_*obs 151
您可以通过使用JAVA_TAGS_FILE的重定向避免将文件名嵌入NUMOFLINES变量中,而不是将文件名作为参数传递给wc.例如:
NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE")
Run Code Online (Sandbox Code Playgroud)
在厕所,如果输入从管道或重定向操作采取实用程序将无法在其输出打印的文件的名称.考虑以下各种示例:
# 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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,wc打印文件名的唯一时间是它作为参数传递,而不是作为标准输入的数据传递.在某些情况下,您可能希望打印文件名,因此了解何时显示文件名很有用.
Ign*_*ams 15
wc 如果你不给它一个文件名,则无法获取文件名.
wc -l < "$JAVA_TAGS_FILE"
Run Code Online (Sandbox Code Playgroud)
(适用于Mac,可能还有其他Unix)
实际上wc方法存在问题:如果它没有以行符号结尾终止,则不计算最后一行.
请改用它
nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs)
Run Code Online (Sandbox Code Playgroud)
甚至更好(感谢gniourf_gniourf):
nblines=$(grep -c '' file.txt)
Run Code Online (Sandbox Code Playgroud)
注意:chilicuil的awk方法也有效.
| 归档时间: |
|
| 查看次数: |
177799 次 |
| 最近记录: |