Logisk OG i et bash-script

Jeg har en if i mit bash-script, der skal kontrollere, om ENHVER af de 2 filer findes, hvis de ikke eksisterer, skal det ekko matche.

Kode jeg har:

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

Men dette gør ikke ” Det ser ikke ud til at fungere af en eller anden grund.

Jeg er 110% sikker på, at disse 2 filer ikke findes. Jeg får ikke nogen fejl, det kommer bare ikke ind i if.

Jeg er ny på bash scripting, så jeg er ikke sikker på hvad der kunne være forkert.

Kommentarer

  • Jeg tror ikke ' jeg tror ikke, at noget af de svar, der er sendt, rent faktisk adresserer spørgsmålet Hvad sker der, når du prøver testene individuelt? Gør [[ ! -f /etc/.../... ]]; echo $? for hver.
  • En advarsel : [[ -f xxx ]] returnerer sandt, hvis der findes xxx og er en almindelig fil (eller et symlink til en almindelig fil). Den returnerer falsk, hvis den ikke ' t eksisterer, eller hvis den ikke kan ' ikke fortæller, om den findes eller ikke, eller om den findes, men ikke er en almindelig fil (bibliotek, rør, enhed, stikkontakt …) eller hvis det ' er et symlink til en fil, der ikke ' ikke findes, eller det kan ' t fortælle om den findes eller ikke eller ikke er en almindelig fil … [[ -e $file ]] || [[ -L $file ]] er tættere på en test for eksistens. ls -d -- "$file" > /dev/null 2>&1 er endnu tættere. Og som regel fører denne form for test til race betingelser. Måske er der ' en anden måde.

Svar

Hvis du vil have enten så vil du have OR, ikke AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Dette vil matche, hvis en eller begge filer mangler.
  • Din kode vil udskriv kun match hvis begge ikke findes.

Men du sagde:

Jeg er 110% sikker på, at disse 2 filer ikke findes. Jeg får ikke nogen fejl, det kommer bare ikke ind i if.

Så din erklæring modsiger sig selv. Mindst en af disse filer skal eksistere, hvis du er kører den kode.

Hvis du vil se, hvordan din if -udtalelse evalueres, skal du køre den med -x.

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

Så vil du se udførelsen.

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

Kommentarer

  • Jeg vil have det til at ekko " matcher " ingen af filerne findes, hvis der findes en, udskriver den ikke. Jeg prøver den med -x
  • I så fald skulle din oprindelige kode være i orden. Og den fungerer faktisk for mig.

Svar

Skal det ikke være sådan? A er en fil, eller B er en fil, så blabla.

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

Svar

Dette fungerer muligvis også for det, du prøver at gøre. Enkelte parenteser bruges ikke ofte i dag med bash, men dette er stadig en mulighed. Brug af “-o” er effektivt en “ELLER” operation, og “!” ophæver betingelsen.

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

Kommentarer

  • Don ' t brug [ i bash. Bortset fra det kan jeg ikke se, hvordan dette besvarer spørgsmålet.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" det burde være. Opgaven var: hvis de (begge) ikke ' ikke eksisterer, skal den echo match.

Svar

Din kode opfylder dine krav: den udskriver match forudsat at den ikke kan finde nogen fil .

Årsagen til match er derfor ikke andetsteds. Du skal bekræfte, at kodeblokken nås, hvilket du kan gøre ved at omslutte den med en par fejlretningsmeddelelser. F.eks. sådan:

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" 

Min sædvanlige præference er, at fejlretningsmeddelelser skal gå til stderr for at undgå at afbryde strømmen af data til stdout , men jeg har undgået det her, fordi du sagde, at du var nybegynder. Her er et eksempel, der viser, hvordan du kan skrive til stdout :

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *