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 matchhvis 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>&1er endnu tættere. Og som regel fører denne form for test til race betingelser. Måske er der ' en anden måde.