如何在BASH条件中检查文件是否有多于1行?

Vil*_*age 20 bash conditional

我需要检查一个文件是否有超过1行.我试过这个:

if [ `wc -l file.txt` -ge "2" ]
then
    echo "This has more than 1 line."
fi


if [ `wc -l file.txt` >= 2 ]
then
    echo "This has more than 1 line."
fi
Run Code Online (Sandbox Code Playgroud)

这些只是报告错误.如何在BASH条件中检查文件是否包含多行?

pax*_*blo 34

命令:

wc -l file.txt
Run Code Online (Sandbox Code Playgroud)

会产生如下输出:

42 file.txt
Run Code Online (Sandbox Code Playgroud)

wc有助于告诉您文件名.如果您一次检出大量文件并且想要个人以及总统计数据,它会这样做:

pax> wc -l *.txt
 973 list_of_people_i_must_kill_if_i_find_out_i_have_cancer.txt
   2 major_acheivements_of_my_life.txt
 975 total
Run Code Online (Sandbox Code Playgroud)

您可以wc通过在标准输入上提供数据来阻止这样做,因此它不知道文件名:

if [[ $(wc -l <file.txt) -ge 2 ]]
Run Code Online (Sandbox Code Playgroud)

以下成绩单显示了这一点:

pax> wc -l qq.c
26 qq.c

pax> wc -l <qq.c
26
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你会注意到我也转而使用[[ ]]$().

我更喜欢前者,因为它由于向后兼容性(主要与字符串拆分有关)而导致问题较少,后者因为嵌套可执行文件要容易得多.


ple*_*siv 6

if [ `wc -l file.txt | awk '{print $1}'` -ge "2" ]
...
Run Code Online (Sandbox Code Playgroud)

您应该始终检查每个子命令返回的内容。命令wc -l file.txt以以下格式返回输出:

12 file.txt
Run Code Online (Sandbox Code Playgroud)

您需要第一列 - 您可以使用awkcut或您选择的任何其他实用程序提取它。


gni*_*urf 6

纯粹的bash(≥4)可能性使用mapfile:

#!/bin/bash

mapfile -n 2 < file.txt
if ((${#MAPFILE[@]}>1)); then
    echo "This file has more than 1 line."
fi
Run Code Online (Sandbox Code Playgroud)

所述mapfile内置存储它从读出stdin的阵列(在MAPFILE默认情况下),每场一行.使用-n 2使其最多读取两行(为了提高效率).之后,您只需要检查数组是否MAPFILE包含多个字段.这种方法非常有效.

作为副产品,文件的第一行存储在${MAPFILE[0]},如果您需要它.你会发现尾部换行符没有被修剪.如果需要删除尾部换行符,请使用以下-t选项:

mapfile -t -n 2 < file.txt
Run Code Online (Sandbox Code Playgroud)