Je suppose que je ne sais pas trop comment faire "et" les tests. Je voulais m'assurer qu'il existait un argument qui fonctionnait bien [ -e $VAR ]
, mais il s'avère qu'il était également évalué comme vrai sur une chaîne vide; ce que je ne veux pas.
Comment puis-je les «et» ensemble? Ou existe-t-il un autre test unaire qui accomplit ce que je veux?
bash
; cependant, pour profiter pleinement des «bashismes», voir la réponse de @ paxdiablo.-a
.Depuis la
bash
page de manuel:Et, pour les expressions, l'une des options est:
Vous pouvez donc
and
les regrouper comme suit (-n
c'est l'opposé de-z
ce que nous pouvons éliminer!
):Cependant, je ne pense pas que ce soit nécessaire dans ce cas,
-e xyzzy
c'est vrai si lexyzzy
fichier existe et peut assez facilement gérer des chaînes vides. Si c'est ce que vous voulez, vous n'avez pas réellement besoin de la-z
vérification non vide:En d'autres termes, utilisez simplement:
la source
[[ -e "$var" ]] && echo "'$var' exists"
la source
POSIX
ne définit pas le comportement de[
avec des ensembles de tests complexes, nous devons éviter d'utiliser-a
ou-o
avec[
. Je l'ai lu ici .bash
balise et ne mentionne pas POSIX, donc je poste cette version qui fonctionne sousbash
et quelques autres shells modernes.bash
ou d'autres coquilles modernes, il y a encore moins de raisons de recommander-a
.[ "$var1" -o "$var2" ]
; sivar1=(
etvar2=)
, alors ce que nous avons est un test pour savoir s'il-o
est non vide, plutôt que si l'unvar1
ou l'autrevar2
n'est pas vide. Ce genre d'ambiguïté est la seule raison légitime de l'x$var
idiome dans les commandes modernes (c'est-à-dire postérieures aux années 90)test
avec des citations correctes, et cet idiome doit mourir dans un incendie.Citez simplement votre variable:
Cela évalue
[ -e "" ]
si$VAR
est vide.Votre version ne fonctionne pas car elle est évaluée
[ -e ]
. Dans ce cas, bash vérifie simplement si le seul argument (-e
) est une chaîne non vide.Depuis la page de manuel:
(De plus, cette solution a l'avantage supplémentaire de travailler avec des noms de fichiers contenant des espaces)
la source
J'ai trouvé une réponse maintenant. Merci pour vos suggestions!
Des commentaires à ce sujet? Il semble inefficace de grep deux fois, mais ça marche ...
la source