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?
if [ ! -z "$var" ] && [ -e "$var" ]; then
# something ...
fi
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 siexpression1
etexpression2
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 xyzzy
fichier 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
if [ -n "$var" -a -e "$var" ]; then
do something ...
fi
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)
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 ...