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
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
[
inbash
. 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, dovrebbeecho 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
[[ ! -f /etc/.../... ]]; echo $?
per ciascuno.[[ -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.