Logisch EN in een bash-script

Ik heb een if in mijn bash-script dat moet controleren of EEN van de 2 bestanden bestaan, als ze niet bestaan, moet deze overeenkomen.

Code die ik heb:

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Maar dit niet ” Het lijkt om de een of andere reden niet te werken.

Ik ben er 110% zeker van dat deze 2 bestanden niet bestaan. Ik krijg geen fouten, het voert gewoon niet de if in.

Ik ben nieuw bij bash-scripting, dus ik weet niet zeker wat fout.

Reacties

  • Ik denk niet dat ' de geposte antwoorden daadwerkelijk betrekking hebben op de vraag . Wat gebeurt er als u de tests afzonderlijk probeert? Voer [[ ! -f /etc/.../... ]]; echo $? voor elk uit.
  • Een waarschuwing : [[ -f xxx ]] retourneert true als xxx bestaat en een normaal bestand is (of een symlink naar een gewoon bestand). Het zal false retourneren als het niet ' t bestaat, of als het ' niet kan vertellen of het bestaat of niet of dat het wel bestaat, maar geen gewoon bestand is (directory, pipe, device, socket …) of als het ' een symbolische link is naar een bestand dat niet ' bestaat of het ' kan zijn niet te zeggen of het bestaat of niet of het geen gewoon bestand is … [[ -e $file ]] || [[ -L $file ]] is dichter bij een test op bestaan. ls -d -- "$file" > /dev/null 2>&1 is zelfs nog dichterbij. En in de regel leidt dit soort tests tot raceomstandigheden. Misschien is er ' s een andere manier.

Antwoord

Als je wilt ofwel en dan wil je OR, niet AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Dit komt overeen als een of beide bestanden ontbreken.
  • Uw code zal print alleen match als beide niet bestaan.

Maar , je zei:

Ik ben er 110% zeker van dat deze 2 bestanden niet bestaan. Ik krijg geen fouten, het voert gewoon niet de if in.

Dus je bewering is in tegenspraak met zichzelf. Minstens één van die bestanden moet bestaan, if jij bent die code uitvoeren.

Als u wilt zien hoe uw if -instructie evalueert, voert u deze uit met -x.

#!/bin/bash -x if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Dan” zie je de uitvoering.

$ ./test.sh + [[ ! -f /etc/benchmarking/code ]] + [[ ! -f /etc/benchmarking/code.class ]] + echo match match $ 

Reacties

  • Ik wil dat het een echo is van " match " als geen van beide bestanden bestaat, als er een bestaat, wordt er geen overeenkomst afgedrukt. Ik zal het proberen met -x
  • In dat geval zou je originele code in orde moeten zijn. En inderdaad werkt het voor mij.

Antwoord

Zou dat niet zo moeten zijn? A is een bestand of B is een bestand, dan blabla.

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; then echo "match" fi 

Antwoord

Dit kan ook werken voor wat u probeert te doen. Enkele haakjes worden tegenwoordig niet vaak gebruikt met bash, maar dit is nog steeds een optie. Het gebruik van “-o” is in feite een “OF” -bewerking, en “!” ontkent de voorwaarde.

var=/etc/benchmarking/code [ ! -f ${var} -o -f {var}.class ] && echo "match" 

Reacties

  • Don ' gebruikt [ nooit in bash. Afgezien daarvan zie ik niet in hoe dit de vraag beantwoordt.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" het zou moeten zijn. De zoektocht was: als ze (beide) niet ' bestaan, zou het echo match moeten zijn.

Answer

Uw code voldoet aan uw vereisten: er wordt match afgedrukt op voorwaarde dat het geen van beide bestanden kan vinden .

Daarom is de reden dat match niet wordt afgedrukt, ergens anders. Je moet bevestigen dat het codeblok wordt bereikt, wat je kunt doen door het te omringen met een een paar foutopsporingsberichten. Bijvoorbeeld als volgt:

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" 

Mijn gebruikelijke voorkeur is dat foutopsporingsberichten naar stderr om te voorkomen dat de gegevensstroom naar stdout wordt onderbroken, maar ik heb dat hier vermeden omdat u zei dat u een beginner was. Hier is een voorbeeld dat laat zien hoe u naar stdout :

echo "@ About to enter if...fi block" >&2 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *