Vous voulez améliorer cette question ? Mettez à jour la question afin qu'elle soit sur le sujet pour Unix et Linux Stack Exchange.
Fermé il y a 5 ans.
Améliorer cette question
J'écris un script bash basé sur un menu, l'une des options du menu consiste à envoyer un e-mail avec une pièce jointe de fichier texte. Je n'arrive pas à vérifier si mon fichier est un fichier texte. Voici ce que j'ai :
fileExists=10
until [ $fileExists -eq 9 ]
do
echo "Please enter the name of the file you want to attach: "
read attachment
isFile=$(file $attachment | cut -d -f2)
if [[ $isFile = "ASCII" ]]
then
fileExists=0
else
echo "$attachment is not a text file, please use a different file"
fi
done
Je reçois sans cesse l'erreur :le délimiteur doit être un seul caractère.
Réponse acceptée :
Le problème se produit dans cut -d -f2
. Changez-le en cut -d -f2
.
Pour cut
, les arguments ressemblent à ceci :
# bash: args(){ for i; do printf '%q \n' "$i"; done; }
# args cut -d -f2
cut
-d -f2
Et voici le problème. a échappé l'espace à un littéral d'espace au lieu d'un délimiteur entre les arguments dans votre shell, et vous n'avez pas ajouté d'espace supplémentaire donc l'ensemble
-d -f2
partie apparaît comme un argument. Vous devez ajouter un espace supplémentaire donc -d
et -f2
apparaissent comme deux arguments.
Pour éviter toute confusion, de nombreuses personnes utilisent des guillemets comme -d' '
à la place.
P.S. :Au lieu d'utiliser un fichier et de tout mettre en ASCII, je préfère utiliser
if file "$attachment2" | grep -q text$; then
# is text
else
# file doesn't think it's text
fi