2 votes

Utilisation d'un tableau pour joindre des fichiers via mailx en bash

Je viens de commencer à apprendre bash et je travaille sur mon premier petit projet. J'essaye d'utiliser un tableau comme argument pour attacher des fichiers en utilisant mail. Cependant, bien qu'un fichier existe dans mon répertoire, mail retourne : No such file or directory.

J'ai essayé de taper manuellement les commandes dans l'interpréteur de commandes en spécifiant le nom du fichier sans utiliser de tableaux et cela fonctionne sans aucune erreur.

Voici le code :

Dans mon répertoire, disons par exemple que j'ai Fichier1, Fichier2, Fichier3. Les noms de fichiers commenceront toujours par le nom "File", mais les numéros de chaque fichier seront différents.

D'abord je définis un tableau avec les numéros de dossier :

esend=(1 2 3)

Ensuite, je boucle sur chaque itération du tableau et je crée une copie de ce tableau en ajoutant à chaque itération -a [Nom du fichier].

# Loop over array and build the arguments for mailx.

for i in "${esend[@]}"

do

   # for each iteration append onto array with -a [filename]

   mailarray=( "${mailarray[@]}" "-a $(find -name "File$i" | sed "s|^\./||")" )

done

Les valeurs dans chaque index devraient être "-a File1 -a File2 -a File3" et maintenant mon plan est d'utiliser ceci comme arguments pour le mail

# "${mailarray[@]}"  will contain the arguments ( -a File1 -a File2 -a File3 )

echo "File being sent from mail" | mailx "${mailarray[@]}" -s "Script.sh" -r "test@test.com" test@test.com

Le résultat réel est que le courrier retourne File1 : No such file or directory found.

Soit je fais quelque chose de mal ici, soit nous ne pouvons tout simplement pas utiliser cette approche ?

0voto

Kubator Points 1243

Dans votre cas, vous devez dé-citer la variable de votre tableau. mailarray afin d'être représentés en tant qu'arguments, sinon ils sont représentés comme une seule chaîne de caractères dans le fichier Bash :

mailx ${mailarray[@]} -s "Script.sh" -r "test@test.com" test@test.com

Mais soyez conscient que c'est une méthode dangereuse : par exemple, tout fichier contenant des caractères spéciaux ne sera pas traité correctement. De plus, vous ne gérez pas non plus les sorties multiples de find. De même, la suppression du chemin avec sed n'est pas nécessaire, il vaut mieux la conserver.

Je préférerais réécrire quelque chose comme ceci (supporte les sorties de recherche multiples). while boucle, supporte les caractères spéciaux -print0 se termine avec un code de retour de mailx ) :

#!/bin/bash
mailargs=()
for ((i=1;i!=4;i++))
do
  while IFS= read -r -d $'\0'
  do
    mailargs+=("-a" "${REPLY}")
  done < <(find ./ -type f -name "File${i}" -print0)
done
echo "File being sent from mail"
mailx "${mailargs[@]}" -s "Script.sh" -r "test@test.com" test@test.com
exit $?

Envisagez également la possibilité, par exemple, de tar plusieurs fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X