Mam if
w swoim skrypcie bash, który musi sprawdzić, czy JESZCZE z 2 plików istnieje, jeśli nie istnieją, powinien pasować do echa.
Kod mam:
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
echo "match"
fi
Ale to z jakiegoś powodu nie działa.
Jestem 110% pewien, że te 2 pliki nie istnieją. Nie otrzymuję żadnych błędów, po prostu nie wchodzi if
.
Jestem nowym użytkownikiem skryptów bash, więc nie jestem pewien, co może być nie tak.
bash
shell-script
Peppercat101
źródło
źródło
[[ ! -f /etc/.../... ]]; echo $?
dla każdego.[[ -f xxx ]]
zwraca true, jeśli xxx istnieje i jest zwykłym plikiem (lub dowiązaniem symbolicznym do zwykłego pliku). Zwróci false, jeśli nie istnieje lub nie może stwierdzić, czy istnieje, czy też nie, ale nie jest zwykłym plikiem (katalog, potok, urządzenie, gniazdo ...) lub jeśli jest dowiązaniem symbolicznym do pliku, który nie istnieje lub nie może stwierdzić, czy istnieje, czy nie jest zwykłym plikiem ...[[ -e $file ]] || [[ -L $file ]]
jest bliżej testu na istnienie.ls -d -- "$file" > /dev/null 2>&1
jest jeszcze bliżej. Z reguły ten rodzaj testu prowadzi do warunków wyścigowych. Może jest inny sposób.Odpowiedzi:
Jeśli chcesz, albo potem chcesz
OR
, nieAND
.match
wtedy, gdy oba nie istnieją.Ale powiedziałeś:
Twoje oświadczenie jest więc sprzeczne. Co najmniej jeden z tych plików musi istnieć, jeśli korzystasz z tego kodu.
Jeśli chcesz zobaczyć, jak
if
ocenia się twoje zdanie, uruchom je-x
.Wtedy zobaczysz wykonanie.
źródło
Czy nie powinno tak być? A to plik lub B to plik, a następnie blabla.
źródło
Może to również działać w przypadku tego, co próbujesz zrobić. Pojedyncze nawiasy klamrowe nie są dziś powszechnie używane w bash, ale nadal jest to opcja. Użycie „-o” jest w rzeczywistości operacją „LUB”, a „!” neguje warunek.
źródło
[
wbash
. Poza tym nie widzę, jak to odpowiada na pytanie.[ ! -f ${var} -a ! -f {var}.class ] && echo "match"
powinno być. Zadanie brzmiało: jeśli (obaj) nie istnieją, powinnoecho match
.Twój kod spełnia twoje wymagania: zostanie wydrukowany
match
pod warunkiem, że nie znajdzie żadnego pliku.Dlatego przyczyna
match
nie jest drukowana jest gdzie indziej. Powinieneś potwierdzić, że blok kodu został osiągnięty, co możesz zrobić, otaczając go kilkoma komunikatami debugowania. Na przykład:Zwykle preferuję debugowanie wiadomości na stderr , aby uniknąć zakłócania przepływu danych na standardowe wyjście , ale unikałem tego tutaj, ponieważ powiedziałeś, że jesteś początkujący. Oto jeden przykład pokazujący, jak możesz napisać na standardowe wyjście :
źródło