AND logico in uno script bash

Ho un if nel mio script bash che deve controllare se ENTRAMBI i 2 file esistono, se non esistono dovrebbe corrispondere alleco.

Codice che ho:

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

Ma questo non lo fa ” Non sembra funzionare per qualche motivo.

Sono sicuro al 110% che questi 2 file non esistono. Non ricevo errori, semplicemente non inserisco if.

Sono nuovo allo scripting bash, quindi “non sono sicuro di cosa potrebbe essere sbagliato.

Commenti

  • Non ' penso che nessuna delle risposte pubblicate risponda effettivamente alla domanda . Cosa succede quando provi i test individualmente? Esegui [[ ! -f /etc/.../... ]]; echo $? per ciascuno.
  • Un avviso : [[ -f xxx ]] restituisce true se xxx esiste e è un file normale (o un collegamento simbolico a un file normale). Restituisce false se non ' non esiste, o se può ' t dire se esiste o meno o se esiste ma non è un file normale (directory, pipe, dispositivo, socket …) o se ' è un collegamento simbolico a un file che ' non esiste o può ' Per dire se esiste o meno o non è un file regolare … [[ -e $file ]] || [[ -L $file ]] è più vicino a un test di esistenza. ls -d -- "$file" > /dev/null 2>&1 è ancora più vicino. E di regola, questo tipo di test porta a condizioni di gara. Forse ' è un altro modo.

Rispondi

Se vuoi e poi OR, non AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Questo corrisponderà se uno o entrambi i file sono mancanti.
  • Il codice sarà stampa solo match se entrambi non esistono.

Ma , hai detto:

Sono sicuro al 110% che questi 2 file non esistono. Non ricevo errori, semplicemente non inserisce if.

Quindi la tua affermazione contraddice se stessa. Almeno uno di questi file deve esistere, se sei eseguendo quel codice.

Se vuoi vedere come sta valutando la tua istruzione if, eseguila con -x.

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

Quindi” vedrai lesecuzione.

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

Commenti

  • Voglio che venga visualizzato " match " se nessuno dei due file esiste, se ne esiste uno non stampa corrispondenza. Lo proverò con -x
  • In tal caso il tuo codice originale dovrebbe andare bene. E in effetti funziona per me.

Risposta

Non dovrebbe essere così? A è un file o B è un file, quindi blabla.

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

Risposta

Questo potrebbe funzionare anche per quello che stai cercando di fare. Le parentesi singole non sono comunemente usate oggi con bash, ma questa è ancora unopzione. Luso di “-o” è effettivamente unoperazione “OR” e “!” nega la condizione.

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

Commenti

  • Don ' Non utilizzare mai [ in bash. A parte questo, non vedo come questo risponda alla domanda.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" dovrebbe essere. La missione era: se (entrambi) don ' t esiste, dovrebbe echo match.

Risposta

Il tuo codice soddisfa i tuoi requisiti: verrà stampato match a condizione che “non riesca a trovare nessuno dei due file .

Pertanto il motivo per cui match non viene stampato è altrove. Dovresti confermare che il blocco di codice è stato raggiunto, cosa che puoi fare circondandolo con un un paio di messaggi di debug. Ad esempio, in questo modo:

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" 

La mia solita preferenza è che i messaggi di debug vadano a stderr per evitare di interrompere il flusso di dati a stdout , ma lho evitato qui perché hai detto di essere un principiante. Ecco un esempio che mostra come potresti scrivere su stdout :

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *