Jak wykonać instrukcję if z wyniku wykonanego polecenia


54

Próbuję wykonać instrukcję JEŻELI z danych wyjściowych wykonanego polecenia. Oto jak próbuję to zrobić, ale to nie działa. Czy ktoś wie, jak to zrobić?

if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then
  echo "Found a Tomcat!"
fi

Odpowiedzi:


65

Użyj [[konstrukcji warunkowej bash i preferuj konwencję podstawiania poleceń $(<command> ). Dodatkowo [[zapobiega dzieleniu słów na wartości zmiennych, dlatego nie ma potrzeby cytowania bitu zastępowania poleceń.

if [[ $(netstat -lnp | grep ':8080') = *java* ]]; then
  echo "Found a Tomcat!"
fi

30

Inną alternatywą jest po prostu przetestowanie samego statusu wyjścia grep, który zwróci false (1), jeśli nie było dopasowania, i true (0), jeśli było, nie używając [polecenia.

if netstat -lntp | grep ':8080.*java' > /dev/null; then
    echo "Found a Tomcat!"
fi

Przekierowanie do / dev / null ma na celu zapobieganie również drukowaniu znalezionej linii na ekranie.


12
Zwróć uwagę na -qopcję grep zamiast przekierowywania do / dev / null. Dzięki -qgrep nic nie wypisuje i przestaje szukać po pierwszym dopasowaniu.
Stéphane Chazelas

5

Jeszcze prostsze

netstat -lntp | grep ':8080.*java' > /dev/null && command

Jeśli chcesz tylko zrobić jedną rzecz.


4

Możesz zrobić bardziej precyzyjne, ale proste, dopasowanie z awk.

if netstat -lnp | awk '$4 ~ /:8080$/ && $7 ~ /java/ {exit(0)} END {exit(1)}'; then 

Aby ściślej dopasować strukturę polecenia, przenośny sposób dopasowywania symboli wieloznacznych na łańcuchu w powłoce polega na casekonstrukcji.

case "$(netstat -lnp | grep ':8080')" in
  *java*)  echo "Found a Tomcat!";;
esac

0

Kolejny przykład z prawdziwego świata :)

if [[ $(HEAD mycompany-intranet.com | grep '200\ OK' | wc -l) = "1" ]];  then
    echo doing some intranet settings (proxy, etc)
else
    echo doing some work-at-home settings (proxy, etc)
fi

Co ma HEADzrobić? Czy to niestandardowa funkcja lub alias w twoim systemie?
luckman212

usr/bin/HEAD → lwp-request. I wydaje się, że to żądanie lwp . Nie jestem pewien, jak do tego doszedłem (na pewno nie ręcznie), czy domyślnie wszystko tam jest. Nie wydaje się być małymi literami usr/bin/head , jak również .
Frank Nocke
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.