2010-09-28 53 views
3

J'essaie de déterminer si un fichier ou un répertoire n'existe pas. J'ai essayé les commandes suivantes pour voir si un fichier existe et ils fonctionnent correctement:Étrangeté avec bash opérateur non

if [ -a 'settings.py' ]; then echo 'exists'; fi 
exists #output 
if [ -a 'foo' ]; then echo 'exists'; fi #outputs nothing 

Mais quand j'essaie ceci:

if [ ! -a 'settings.py' ]; then echo 'does not exist'; fi 
does not exist #shouldn't be output since the file does exist 
if [ ! -a 'foo' ]; then echo 'does not exist'; fi 
does not exist 

«n'existe pas » est sortie, peu importe quoi.

Répondre

1

Essayez d'utiliser -e à la place de -a

Cette page sur le Linux Documentation Project dit:

-a est identique en vigueur à -e. Mais il a été déprécié, et son utilisation est découragée.

+2

Ouais. Explication supplémentaire: '-a' est interprété comme" et "plutôt que" test d'existence "quand ce n'est pas la première chose après' ['. "Non et" n'a pas de sens, dites-vous? Ayup. C'est l'une des nombreuses raisons pour lesquelles vous ne devriez jamais utiliser '-a' /' -o' dans leurs significations "et"/"ou", soit; utilisez '[...] && [...]'/'[...] || [...] 'à la place. Annoyamment verbeux, dites-vous? Ayup. Shell suce, film à onze heures. – zwol

2

J'ai déjà eu des problèmes avec la commande [ auparavant. Je préfère la variante [[ car elle est beaucoup plus puissante et, selon mon expérience, moins sujette à des «pièges» comme celui-ci.

Si vous utilisez la commande [[, vos commandes de test fonctionnent bien:

pax> touch qq 
pax> if [[ -a qq ]] ; then echo exists ; fi 
exists 
pax> if [[ ! -a qq ]] ; then echo not exists ; fi 
pax> rm qq 
pax> if [[ ! -a qq ]] ; then echo not exists ; fi 
not exists 
+0

Je ne peux pas être en désaccord plus - '[' est portable, si vous connaissez toutes ses bizarreries; '[[' ne peut pas être invoqué pour exister. – zwol

+3

@Zack, la question est étiquetée 'bash'. Je suis conscient que d'autres obus peuvent ne pas le fournir. Et je suis sûr que vous pourriez être en désaccord plus - il vous suffit d'essayer plus fort :-) – paxdiablo

+3

En outre, avec '[[' vous pouvez utiliser '&&' et '||' sans avoir à casser les expressions entre crochets. '[[foo && bar || baz]] 'au lieu de' [foo] && [bar] || [baz] ' –

0

vous pouvez utiliser test

test -e "$file" && echo "exists"