Jestem nowy w bashu i utknąłem na próbie zanegowania następującego polecenia:
wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
echo "Sorry you are Offline"
exit 1
Dzieje się tak, jeśli warunek zwraca wartość true, jeśli mam połączenie z Internetem. Chcę, żeby stało się to na odwrót, ale umieszczanie w !
dowolnym miejscu nie wydaje się działać.
linux
bash
if-statement
negate
Sudh33ra
źródło
źródło
if ! [[ ...
działaOdpowiedzi:
Możesz wybrać:
!
odwraca odpowiednio zwrot następującego wyrażenia.źródło
test
poleceniem:if test $? -ne 0; then
if
oczekuje instrukcji o wartości 0 lub 1, więc możesz użyć samego polecenia i odwrócić je:if ! wget ...; then ...; fi
Lepszy
źródło
!
następującą komendą, w przeciwnym razie wykonasz rozwinięcie historii. unix.stackexchange.com/questions/3747/…Jeśli czujesz się leniwy, oto zwięzła metoda obsługi warunków za pomocą
||
(lub) i&&
(i) po operacji:źródło
&&
after echo na a;
. Powodem tego jest to, że jeśli dane wyjściowe są przekierowywane do pliku na pełnym dysku,echo
zwróci błąd iexit
nigdy się nie uruchomi. Prawdopodobnie nie jest to pożądane zachowanie.set -e
a niepowodzenie iecho
tak wyjdzie ze skryptuPonieważ porównujesz liczby, możesz użyć wyrażenia arytmetycznego , które pozwala na prostszą obsługę parametrów i porównanie:
Zwróć uwagę, że zamiast tego
-ne
możesz po prostu użyć!=
. W kontekście arytmetycznym nie musimy nawet poprzedzać$
parametrów, tj.działa doskonale. Nie dotyczy to jednak
$?
specjalnego parametru.Ponadto, ponieważ
(( ... ))
ocenia wartości niezerowe jako prawdziwe, tj. Zwraca stan 0 dla wartości niezerowych i zwracany stan 1, w przeciwnym razie moglibyśmy skrócić doale może to zmylić więcej osób, niż warte są zapisane naciśnięcia klawiszy.
(( ... ))
Konstrukt jest dostępny w konsoli, ale nie jest to wymagane w opisie powłoki POSIX (wymienione jako możliwe przedłużenie, choć).Biorąc to wszystko pod uwagę, lepiej
$?
moim zdaniem unikać w ogóle, jak w odpowiedzi Cole'a i odpowiedzi Stevena .źródło
(( ... ))
? Dokumentacja programistów POSIX - Polecenia złożone:)
Możesz użyć nierównego porównania
-ne
zamiast-eq
:źródło