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
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
[
wbash
. 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ą, powinnoecho 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
[[ ! -f /etc/.../... ]]; echo $?
dla każdego.[[ -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.