Logisches UND in einem Bash-Skript

Ich habe ein if in meinem Bash-Skript, das prüfen muss, ob BEIDES von Die 2 Dateien sind vorhanden. Wenn sie nicht vorhanden sind, sollte sie übereinstimmen.

Code, den ich habe:

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

Aber das ist nicht der Fall. “ Es scheint aus irgendeinem Grund nicht zu funktionieren.

Ich bin zu 110% sicher, dass diese beiden Dateien nicht existieren. Ich erhalte keine Fehler, es wird nur nicht die if eingegeben.

Ich bin neu im Bash-Scripting, daher bin ich mir nicht sicher, was sein könnte falsch.

Kommentare

  • Ich glaube nicht, dass eine der veröffentlichten Antworten tatsächlich die Frage anspricht.
    = „74bb4c8b2c“>

    Was passiert, wenn Sie die Tests einzeln versuchen? Führen Sie für jeden [[ ! -f /etc/.../... ]]; echo $? aus.

  • Eine Warnung : [[ -f xxx ]] gibt true zurück, wenn xxx vorhanden ist und eine reguläre Datei ist (oder ein Symlink zu einer regulären Datei). Es wird false zurückgegeben, wenn dies nicht der Fall ist ' nicht vorhanden oder ob es ' nicht sagen kann, ob es vorhanden ist oder nicht oder ob es vorhanden ist, aber keine reguläre Datei (Verzeichnis, Pipe, Gerät, Socket …) oder Wenn ' ein Symlink zu einer Datei ist, die nicht ' existiert, oder ' t sagen, ob es existiert oder nicht oder keine reguläre Datei ist … [[ -e $file ]] || [[ -L $file ]] ist näher an einem Existenztest. ls -d -- "$file" > /dev/null 2>&1 ist noch näher. Und in der Regel führt diese Art von Test zu Rennbedingungen. Vielleicht gibt es ' einen anderen Weg.

Antwort

If Sie möchten entweder , dann möchten Sie OR, nicht AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Dies stimmt überein, wenn eine oder beide Dateien fehlen.
  • Ihr Code wird Drucken Sie match nur aus, wenn beide nicht vorhanden sind.

Aber , Sie sagten:

Ich bin zu 110% sicher, dass diese beiden Dateien nicht vorhanden sind. Ich erhalte keine Fehler, es wird nur kein if eingegeben.

Ihre Aussage widerspricht sich also. Mindestens eine dieser Dateien muss vorhanden sein, wenn Sie sind Ausführen von diesem Code.

Wenn Sie sehen möchten, wie Ihre if -Anweisung ausgewertet wird, führen Sie sie mit .

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

Dann wird die Ausführung angezeigt.

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

Kommentare

  • Ich möchte, dass " mit " übereinstimmt, wenn Keine der Dateien existiert, wenn eine existiert, wird keine Übereinstimmung gedruckt. Ich werde es mit -x versuchen.
  • In diesem Fall sollte Ihr Originalcode in Ordnung sein. Und tatsächlich funktioniert es für mich.

Antwort

Sollte das nicht so sein? A ist eine Datei oder B ist eine Datei, dann blabla.

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

Antwort

Dies funktioniert möglicherweise auch für das, was Sie versuchen. Einzelne Klammern werden heutzutage bei Bash nicht häufig verwendet, dies ist jedoch immer noch eine Option. Die Verwendung von „-o“ ist effektiv eine „ODER“ -Operation und „!“ negiert die Bedingung.

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

Kommentare

  • Don ' Verwenden Sie niemals [ in bash. Abgesehen davon sehe ich nicht, wie dies die Frage beantwortet.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" sollte es sein. Die Quest war: Wenn sie (beide) nicht ' existieren, sollte sie echo match sein.

Antwort

Ihr Code erfüllt Ihre Anforderungen: Er gibt match aus, sofern keine der beiden Dateien gefunden werden kann

Daher wird der Grund, warum match nicht gedruckt wird, an anderer Stelle angegeben. Sie sollten bestätigen, dass der Codeblock erreicht wird. Dies können Sie tun, indem Sie ihn mit einem umgeben Beispiel:

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" 

Meine übliche Präferenz ist das Debuggen von Nachrichten an stderr um zu vermeiden, dass der Datenfluss zu stdout unterbrochen wird, aber ich habe dies hier vermieden, weil Sie sagten, Sie seien ein Anfänger. Hier ist ein Beispiel, das zeigt, wie Sie in stdout :

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.