Logisk OG i et bash-skript

Jeg har en if i mitt bash-skript som må sjekke om ENHVER av de to filene eksisterer, hvis de ikke eksisterer, skal det ekko samsvares.

Kode jeg har:

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

Men dette gjør ikke det ser ikke ut til å fungere av en eller annen grunn.

Jeg er 110% sikker på at disse to filene ikke eksisterer. Jeg får ikke feil, det kommer bare ikke inn i if.

Jeg er ny på å bash scripting, så jeg er ikke sikker på hva som kan være feil.

Kommentarer

  • Jeg tror ikke ' jeg tror ikke noe av svarene som er lagt ut faktisk adresserer spørsmålet Hva skjer når du prøver testene individuelt? Gjør [[ ! -f /etc/.../... ]]; echo $? for hver.
  • En advarsel : [[ -f xxx ]] returnerer true hvis xxx eksisterer og er en vanlig fil (eller en symlink til en vanlig fil). Den vil returnere false hvis den ikke ' t eksisterer, eller om den kan ' t fortelle om den eksisterer eller ikke, eller om den eksisterer, men ikke er en vanlig fil (katalog, rør, enhet, stikkontakt …) eller hvis den ' er en symlink til en fil som ikke ' ikke eksisterer, eller den kan ' t fortelle om den eksisterer eller ikke eller ikke er en vanlig fil … [[ -e $file ]] || [[ -L $file ]] er nærmere en test for eksistens. ls -d -- "$file" > /dev/null 2>&1 er enda nærmere. Og som regel fører denne typen test til løpsforhold. Kanskje det ' er en annen måte.

Svar

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

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Dette vil samsvare hvis den ene eller begge filene mangler.
  • Koden din vil skriv bare ut match hvis begge ikke eksisterer.

Men du sa:

Jeg er 110% sikker på at disse 2 filene ikke eksisterer. Jeg får ikke feil, det kommer bare ikke inn i if.

Så utsagnet ditt strider mot seg selv. Minst en av disse filene eksistere, hvis du er kjører den koden.

Hvis du vil se hvordan if uttalelsen evalueres, kjør den med -x.

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

Så ser du kjøringen.

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

Kommentarer

  • Jeg vil at det skal ekko " matche " hvis ingen av filene eksisterer, hvis en ikke eksisterer, kan den ikke skrives ut. Jeg vil prøve den med -x
  • I så fall burde den originale koden være bra. Og den fungerer faktisk for meg.

Svar

Skal ikke det være slik? 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 kan også fungere for det du prøver å gjøre. Enkelte parenteser brukes ikke ofte i dag med bash, men dette er fortsatt et alternativ. Å bruke «-o» er effektivt en «ELLER» -operasjon, og «!» opphever tilstanden.

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

Kommentarer

  • Don ' t bruk [ i bash. Bortsett fra det, klarer jeg ikke å se hvordan dette svarer på spørsmålet.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" det burde være. Oppdraget var: hvis de (begge) ikke ' ikke eksisterer, bør det echo match.

Svar

Koden din tilfredsstiller dine krav: den vil skrive ut match forutsatt at den ikke kan finne noen av filene .

Årsaken til at match ikke blir skrevet ut, er derfor andre steder. Du bør bekrefte at kodeblokken nås, noe du kan gjøre ved å omgi den med en par feilsøkingsmeldinger. For eksempel slik:

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 vanlige preferanse er at feilsøkingsmeldinger går til stderr for å unngå å forstyrre datastrømmen til stdout , men jeg har unngått det her fordi du sa at du var nybegynner. Her er et eksempel som viser hvordan du kan skrive til stdout :

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *