用于检查具有不同名称的多个文件的shell脚本

时间:2014-11-15 09:43:24

标签: bash unix

我正在创建一个脚本来检查目录中的3个文件,记录其中的行数,如果行存在则发送邮件。如果这些文件中的任何一个已经计数,我只需要发送一封邮件,我结束发送3封邮件。

对于Ex。我有这些文件

process_date.txt
thread_date.txt
child_date.txt

我正在做类似

的事情
$1= process_date.txt
$2= thread_date.txt
$3= child_date.txt

if [ -f $1 ]
then
count1=`wc-l < $1`
if $count1 -ne 0 then mailx abc.com
fi
fi

if [ -f $2 ]
then
count2=`wc-l < $2`
if $count2 -ne 0 then mailx abc.com
fi
fi 

if [ -f $3 ]
then
count3=`wc-l < $3`
if $count3 -ne 0 then mailx abc.com
fi
fi

3 个答案:

答案 0 :(得分:3)

正如您所说的那样,您似乎只需要检查至少有一个文件是非空的:您不需要计算行数。在Bash中,您可以使用[[ -s file ]]测试来准确测试file是否存在且非空。所以你可以这样做:

#!/bin/bash

if [[ -s $1 ]] || [[ -s $2 ]] || [[ -s $3 ]]; then
    mailx abc.com
fi

更一般地说,如果至少有一个作为参数提供的文件存在且非空,则可以发送邮件:

#!/bin/bash

for file; do
    if [[ -s $file ]]; then
        mailx abc.com
        break
    fi
done

您将此称为

scriptname process_date.txt thread_date.txt child_date.txt

答案 1 :(得分:1)

您可以将脚本包装在函数中,并在每return后使用mailx命令,如下所示:

send_one_mail() {
  if [ -f "$1" ]
  then
    count1=$(wc -l < "$1")
    if [ $count1 -ne 0 ]
    then
      mailx abc.com
      return
    fi
  fi

  # etc. for other conditions

}

send_one_mail process_date.txt thread_date.txt child_date.txt

答案 2 :(得分:1)

试试这个:

if [ -f $1 ]
then
    count1=`wc -l < $1`
fi

if [ -f $2 ]
then
    count2=`wc -l < $2` 
fi 

if [ -f $3 ]
then
    count3=`wc -l < $3`
fi


if [ $count1 -ne 0 -o $count2 -ne 0 -o $count3 -ne 0 ]
then
    mailx abc.com
fi