Logiczne ORAZ w skrypcie basha

Mam if w moim skrypcie basha, który musi sprawdzić, czy JESZCZE z te 2 pliki istnieją, jeśli nie istnieją, to powinno odpowiadać echo.

Kod, który mam:

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

Ale tak nie jest ” z jakiegoś powodu nie wydaje się działać.

Jestem w 110% pewien, że te 2 pliki nie istnieją. Nie widzę żadnych błędów, po prostu nie wpisuje if.

Jestem nowy w skryptach bash, więc nie jestem pewien, co może być źle.

Komentarze

  • Nie ' nie sądzę, że żadna z zamieszczonych odpowiedzi faktycznie odnosi się do pytania . Co się stanie, gdy wypróbujesz testy indywidualnie? Wykonaj [[ ! -f /etc/.../... ]]; echo $? dla każdego.
  • Ostrzeżenie : [[ -f xxx ]] zwraca prawdę, jeśli istnieje xxx i jest zwykłym plikiem (lub dowiązaniem symbolicznym do zwykłego pliku). Zwraca wartość fałsz, jeśli nie ' t istnieje, lub jeśli nie może ' t powiedzieć, czy istnieje, czy nie, lub czy istnieje, 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 ' t powiedzieć, czy istnieje, czy nie, czy też nie jest zwykłym plikiem … [[ -e $file ]] || [[ -L $file ]] jest bliżej testu istnienia. ls -d -- "$file" > /dev/null 2>&1 jest jeszcze bliżej. Z reguły tego rodzaju test prowadzi do warunków wyścigu. Może jest ' inny sposób.

Odpowiedz

Jeśli chcesz albo , potem OR, a nie AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then echo "match" fi 
  • Dopasuje się, jeśli brakuje jednego lub obu plików.
  • Twój kod będzie drukuj tylko match, jeśli oba nie istnieją.

Ale powiedziałeś:

Jestem na 110% pewien, że te 2 pliki nie istnieją. Nie widzę żadnych błędów, po prostu nie wpisuje if.

Więc twoje stwierdzenie jest sprzeczne ze sobą. Co najmniej jeden z tych plików musi istnieć, jeśli jesteś uruchamianie tego kodu.

Jeśli chcesz zobaczyć, jak oblicza się Twoja instrukcja if, uruchom ją z -x.

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

Następnie” zobaczysz wykonanie.

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

Komentarze

  • Chcę, aby wyświetlało echo " pasujące do ", jeśli żaden plik nie istnieje, jeśli taki istnieje, nie wypisuje dopasowania. Spróbuję z -x
  • W takim przypadku oryginalny kod powinien działać poprawnie. I rzeczywiście działa dla mnie.

Odpowiedź

Czy nie powinno tak być? A to plik lub B to plik, a następnie blabla.

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

Odpowiedź

Może to również działać w przypadku tego, co próbujesz zrobić. Pojedyncze nawiasy nie są obecnie powszechnie używane z bash, ale nadal jest to opcja. Użycie „-o” jest efektywną operacją „LUB”, a „!” neguje warunek.

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

Komentarze

  • Don ' nigdy nie używaj [ w bash. Poza tym nie widzę, jak to odpowiada na pytanie.
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match" powinno. Zadanie brzmiało: jeśli (obaj) nie ' nie istnieją, powinno echo match.

Odpowiedź

Twój kod spełnia Twoje wymagania: wydrukuje match pod warunkiem, że „nie może znaleźć żadnego z plików .

Dlatego powód match nie jest drukowany gdzie indziej. Powinieneś potwierdzić, że blok kodu został osiągnięty, co możesz zrobić, otaczając go znakiem kilka komunikatów debugowania. Na przykład taka:

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" 

Zwykle preferuję, aby komunikaty debugowania były kierowane do stderr aby uniknąć przerywania przepływu danych do stdout , ale uniknąłem tego tutaj, ponieważ powiedziałeś, że jesteś początkującym. Oto jeden przykład pokazujący, jak możesz pisać na stdout :

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *