J'ai un if
dans mon script bash qui doit vérifier si l'un des 2 fichiers existe, s'ils n'existent pas, il devrait correspondre à l'écho.
Code que j'ai:
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
Mais cela ne semble pas fonctionner pour une raison quelconque.
Je suis sûr à 110% que ces 2 fichiers n'existent pas. Je ne reçois aucune erreur, il n'entre simplement pas dans le if
.
Je suis nouveau dans les scripts bash, donc je ne suis pas sûr de ce qui pourrait mal se passer.
bash
shell-script
Peppercat101
la source
la source
[[ ! -f /etc/.../... ]]; echo $?
pour chacun.[[ -f xxx ]]
renvoie vrai si xxx existe et est un fichier normal (ou un lien symbolique vers un fichier normal). Il retournera false s'il n'existe pas, ou s'il ne peut pas dire s'il existe ou non ou s'il existe mais n'est pas un fichier normal (répertoire, pipe, périphérique, socket ...) ou s'il s'agit d'un lien symbolique à un fichier qui n'existe pas ou qui ne peut pas dire s'il existe ou non ou n'est pas un fichier normal ...[[ -e $file ]] || [[ -L $file ]]
est plus proche d'un test d'existence.ls -d -- "$file" > /dev/null 2>&1
est encore plus proche. Et en règle générale, ce type de test conduit à des conditions de course. Peut-être qu'il y a une autre façon.Réponses:
Si vous voulez soit vous voulez
OR
, nonAND
.match
si les deux n'existent pas.Mais vous avez dit:
Votre déclaration se contredit donc. Au moins un de ces fichiers doit exister si vous exécutez ce code.
Si vous souhaitez voir comment votre
if
instruction est en cours d'évaluation, exécutez-la avec-x
.Ensuite, vous verrez l'exécution.
la source
Cela ne devrait-il pas être ainsi? A est un fichier ou B est un fichier, puis blabla.
la source
Cela peut également fonctionner pour ce que vous essayez de faire. Les parenthèses simples ne sont pas couramment utilisées aujourd'hui avec bash, mais c'est toujours une option. L'utilisation de '-o' est en fait une opération "OU" et "!" nie la condition.
la source
[
dansbash
. Mis à part cela, je ne vois pas comment cela répond à la question.[ ! -f ${var} -a ! -f {var}.class ] && echo "match"
ça devrait être. La quête était: s'ils (les deux) n'existent pas, cela devraitecho match
.Votre code répond à vos besoins: il s'imprimera à
match
condition qu'il ne trouve aucun fichier.Par conséquent, la raison
match
n'est pas imprimée ailleurs. Vous devez confirmer que le bloc de code est atteint, ce que vous pouvez faire en l'entourant de quelques messages de débogage. Par exemple, comme ceci:Ma préférence habituelle est que les messages de débogage soient envoyés à stderr afin d'éviter d'interrompre le flux de données vers stdout , mais je l'ai évité ici parce que vous avez dit que vous étiez un débutant. Voici un exemple montrant comment vous pourriez écrire sur stdout :
la source