Verifique se um arquivo é um arquivo de texto no bash

0

Estou tentando fazer uma verificação para ver se o arquivo que está sendo anexado ao email é um arquivo de texto e, se não estiver, ele retornará um erro. No entanto, durante o teste, forneço um texto.txt válido e retorna a mensagem "Anexo inválido".

send_email()                
{
  message=
  address=
  attachment=
  validuser=1
echo "Enter the email address: "
read address
echo ""
getent passwd | grep -q $address
if [ "$?" = "0" ]
  then
    echo -n "Enter the subject of the message: "
    read message
    echo ""

    echo "Enter the file you want to attach: "
    read attachment
    attachmenttype='file $attachment | cut -d\  -f2'
    if [ $attachmenttype = "ASCII" ]
  then 
  mail -s "$message" "$address"<"$attachment"
  press_enter
elif [ $attachmenttype = "cannot" ]
  then 
  mail -s "$message" "$address"<"$attachment"
  press_enter
else
  echo "Invalid attachment"
  press_enter
fi
 else
    echo "Invalid username"
    press_enter
fi

}

    
por Duncan 10.12.2014 / 06:39

2 respostas

3

Em vez de

attachmenttype='file $attachment | cut -d\  -f2'

você deve escrever:

attachmenttype=$(file "$attachment" | cut -d' ' -f2)

Veja o link

ou para obter tipo mime :

$ file -i "$attachmenttype" | cut -d' ' -f2
text/plain;

e decidir o que você quer fazer com o arquivo depende do tipo.

    
por 10.12.2014 / 06:44
1

Seu problema está aqui:

$ attachmenttype='file $attachment | cut -d\  -f2'
$ echo $attachmenttype
file $attachment | cut -d\ -f2

Neste comando você apenas armazena a string file $attachment | cut -d\ -f2 em attachmenttype e quando você faz o check-in se você receber um resultado inválido. Você precisa usar o bash Command Substitution $(...) para evitar resultados errados.

E uma coisa sobre cut -d\ -f2 que alguém lhe diz que não está correto: Isso está strongmente correto porque este comando já usa o espaço como delimitador de campo porque você acabou de escapar com \ . veja espaços duplos entre -d\ -f2 .

Errado:

$ read attachment
/home/KasiyA/file.txt
$ attachmenttype='file $attachment | cut -d\  -f2'
$ if [[ $attachmenttype = "ASCII" ]]; then echo "valid" ;else echo "invalid"; fi
invalid

Correto:

$ read attachment
/home/KasiyA/file.txt
$ attachmenttype=$(file $attachment | cut -d\  -f2)
$ if [[ $attachmenttype = "ASCII" ]]; then echo "valid" ;else echo "invalid"; fi
valid
    
por 10.12.2014 / 07:06