我需要检查一个文件是否有超过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)
顺便说一句,你会注意到我也转而使用[[ ]]
和$()
.
我更喜欢前者,因为它由于向后兼容性(主要与字符串拆分有关)而导致问题较少,后者因为嵌套可执行文件要容易得多.
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)
您需要第一列 - 您可以使用awk
或cut
或您选择的任何其他实用程序提取它。
纯粹的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)
归档时间: |
|
查看次数: |
23576 次 |
最近记录: |