web-dev-qa-db-fra.com

Si le fichier existe et n'est pas vide. Me donne toujours la fausse valeur

J'ai un script bash:

 echo " enter file name "
 read $file
 if [ -f "$file" ] && [ -s "$file" ]
 then 
    echo " file does not exist, or is empty "
 else
    echo " file exists and is not empty "
 fi

Peu importe ce que j'entre en tant que $file, ça me donne la fausse valeur. Je peux même entrer dans un fichier qui n'existe même pas, il me donnera toujours la valeur fausse. Pourquoi est-ce les gars? Merci d'avance

32
semkius

Il suffit de vérifier -s, Car il dit:

FILE existe et a une taille supérieure à zéro

http://unixhelp.ed.ac.uk/CGI/man-cgi?test

de plus, votre sortie est commutée, donc elle génère does not exists lorsqu'un fichier existe, car -s donnera TRUE si le fichier existe ET a un size > 0.

Si correctement, vous devriez utiliser:

echo " enter file name "
read file
if [ -s "$file" ]
then 
   echo " file exists and is not empty "
else
   echo " file does not exist, or is empty "
fi

Cela vous donnera le résultat attendu.

En outre, il devrait être

read file

au lieu de

read $file

Si vous souhaitez plus d’informations, je vous recommande de lire man test et man read

69
Nidhoegger

Veuillez noter que [ -f "$file" ] && [ -s "$file" ] retournera true si le fichier existe et n’est pas vide.

Autre option:

if [[ -f "/path/to/file" && -s "/path/to/file" ]]; then 
    echo "exist and not empty"
else 
    echo "not exist or empty"; 
fi
6
Samuel