web-dev-qa-db-fra.com

bash conditionals: comment "et" expressions? (si [! -z $ VAR && -e $ VAR])

Je suppose que je ne suis pas clair sur la façon de faire "et" des tests. Je voulais m'assurer qu'il existait un argument qui fonctionnait bien avec [ -e $VAR ] mais qui s'avère également être évalué comme étant vrai sur une chaîne vide; ce que je ne veux pas.

Comment puis-je et les ensemble? Ou y a-t-il un autre test unaire qui réalise ce que je veux?

265
atxdba
if [ ! -z "$var" ] && [ -e "$var" ]; then
      # something ...
fi
500
jaypal singh

De la page de manuel bash:

[[ expression ]] - renvoie un statut de 0 ou 1 en fonction de l'évaluation de l'expression d'expression conditionnelle.

Et, pour les expressions, l'une des options est:

expression1 && expression2 - true si expression1 et expression2 sont tous deux vrais.

Ainsi, vous pouvez and ensemble (comme suit) (-n est le contraire de -z afin que nous puissions nous débarrasser de !):

if [[ -n "$var" && -e "$var" ]] ; then
    echo "'$var' is non-empty and the file exists"
fi

Cependant, je ne pense pas que cela soit nécessaire dans ce cas, -e xyzzy est vrai si le xyzzyfichier existe et peut très facilement gérer des chaînes vides. Si c'est ce que vous voulez, vous n'avez pas besoin du chèque non vide -z:

pax> VAR=xyzzy
pax> if [[ -e $VAR ]] ; then echo yes ; fi
pax> VAR=/tmp
pax> if [[ -e $VAR ]] ; then echo yes ; fi
yes

En d'autres termes, utilisez simplement:

if [[ -e "$var" ]] ; then
    echo "'$var' exists"
fi
66
paxdiablo
if [ -n "$var" -a -e "$var" ]; then
    do something ...
fi

9
Slava Semushin

Citez simplement votre variable:

[ -e "$VAR" ]

Cela donne [ -e "" ] si $VAR est vide.

Votre version ne fonctionne pas car elle porte la valeur [ -e ]. Dans ce cas, bash vérifie simplement si l'argument unique (-e) est une chaîne non vide.

De la page de manuel:

test et [évaluent les expressions conditionnelles à l'aide d'un ensemble de règles basées sur le nombre d'arguments. ...

1 argument

L'expression est vraie si et seulement si l'argument n'est pas null.

(En outre, cette solution présente l’avantage supplémentaire de travailler avec des noms de fichiers contenant des espaces)

4
user123444555621

J'ai trouvé une réponse maintenant, merci pour vos suggestions!

for e in ./*.cutoff.txt; do
if grep -q -E 'COX1|Cu-oxidase' $e
then
    echo xyz >$e.match.txt
else
    echo
fi

if grep -q -E 'AMO' $e
then
    echo abc >$e.match.txt
else
    echo
fi; done

des commentaires à ce sujet? Cela semble inefficace de faire deux fois grep, mais ça marche ...

1
rororo