Jai un if
dans mon script bash qui doit vérifier si SOIT les 2 fichiers existent, sils « nexistent pas, ils devraient correspondre.
Code que jai:
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi
Mais ce nest pas le cas » t ne semble pas fonctionner pour une raison quelconque.
Je suis sûr à 110% que ces 2 fichiers nexistent pas. Je nobtiens aucune erreur, il ne saisit simplement pas le if
.
Je suis nouveau dans les scripts bash, donc je ne sais pas ce qui pourrait être faux.
Commentaires
Réponse
Si vous voulez soit puis vous voulez OR
, pas AND
.
if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi
- Cela correspondra si lun ou les deux fichiers sont manquants.
- Votre code sera Nimprimez
match
que si les deux nexistent pas.
Mais , vous avez dit:
Je suis sûr à 110% que ces 2 fichiers nexistent pas. Je nobtiens aucune erreur, il nentre simplement pas le if.
Donc votre déclaration se contredit. Au moins un de ces fichiers doit exister, si vous êtes exécutez ce code.
Si vous voulez voir comment votre instruction if
évalue, exécutez-la avec -x
.
#!/bin/bash -x if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi
Ensuite, vous » verrez lexécution.
$ ./test.sh + [[ ! -f /etc/benchmarking/code ]] + [[ ! -f /etc/benchmarking/code.class ]] + echo match match $
Commentaires
- Je veux quil fasse écho " match " si aucun fichier nexiste, sil en existe un, il nimprime pas la correspondance. Je vais lessayer avec -x
- Dans ce cas, votre code dorigine devrait convenir. Et en effet, cela fonctionne pour moi.
Réponse
Cela ne devrait-il pas être comme ça? A est un fichier ou B est un fichier, puis blabla.
if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; then echo "match" fi
Réponse
Cela peut également fonctionner pour ce que vous essayez de faire. Les parenthèses simples ne sont pas couramment utilisées aujourdhui avec bash, mais cela reste une option. Lutilisation de « -o » est effectivement une opération « OU », et « ! » annule la condition.
var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match"
Commentaires
- Don ' t jamais utiliser
[
dansbash
. En dehors de 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 la suivante: sils (tous les deux) nexistent pas ', ils devraientecho match
.
Réponse
Votre code répond à vos exigences: il imprimera match
à condition quil « ne trouve aucun fichier .
Par conséquent, la raison pour laquelle match
nest pas imprimé est ailleurs. Vous devez confirmer que le bloc de code est atteint, ce que vous pouvez faire en lentourant dun quelques messages de débogage. Par exemple, comme ceci:
echo "@ About to enter if...fi block" if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi echo "@ Finished if...fi block"
Ma préférence habituelle est que les messages de débogage soient envoyés à stderr afin déviter dinterrompre le flux de données vers stdout , mais je lai évité ici parce que vous avez dit que vous étiez un débutant. Voici un exemple montrant comment vous pourriez écrire dans stdout :
echo "@ About to enter if...fi block" >&2
[[ ! -f /etc/.../... ]]; echo $?
pour chacun.[[ -f xxx ]]
renvoie true si xxx existe et est un fichier normal (ou un lien symbolique vers un fichier normal). Il retournera false si ce nest pas le cas ' t exister, ou sil peut ' t dire sil existe ou non ou sil existe mais nest pas un fichier normal (répertoire, pipe, périphérique, socket …) ou sil ' un lien symbolique vers un fichier qui ' existe ou il ne peut ' t dire sil existe ou non ou nest pas un fichier régulier …[[ -e $file ]] || [[ -L $file ]]
est plus proche dun test dexistence.ls -d -- "$file" > /dev/null 2>&1
est encore plus proche. Et en règle générale, ce genre de test conduit à des conditions de course. Peut-être existe-t-il une autre '.