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
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 må 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
[
ibash
. 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 detecho 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
[[ ! -f /etc/.../... ]]; echo $?
for hver.[[ -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.