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