Come eseguire un'istruzione if dal risultato di un comando eseguito


54

Sto provando a fare un'istruzione IF dall'output di un comando eseguito. Ecco come sto cercando di farlo, ma non funziona. Qualcuno conosce il modo giusto per farlo?

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

Risposte:


65

Utilizzare il [[costrutto condizionale bash e preferire la convenzione di sostituzione comando $(<comando> ). Inoltre, [[impedisce la suddivisione delle parole dei valori delle variabili, pertanto non è necessario citare il bit di sostituzione dei comandi.

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

30

Un'altra alternativa è semplicemente testare lo stato di uscita di grepse stesso, che restituirà false (1) se non c'era corrispondenza e true (0) se ce n'era una, non usando il [comando.

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

Il reindirizzamento su / dev / null è per impedire che stampi anche la linea trovata sullo schermo.


12
Nota l' -qopzione grep invece di reindirizzare a / dev / null. Con -q, grep non emette nulla e interrompe la ricerca dopo la prima corrispondenza.
Stéphane Chazelas,

5

Ancora più semplice,

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

Se vuoi solo fare una cosa.


4

Puoi fare una corrispondenza più precisa, ma semplice, con awk.

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

Per abbinare più da vicino la struttura del tuo comando, il modo portatile di eseguire la corrispondenza jolly su una stringa in una shell è con il casecostrutto.

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

0

Un altro esempio del mondo reale :)

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

Cosa fa HEAD? È una funzione personalizzata o un alias sul tuo sistema?
luckman212

usr/bin/HEAD → lwp-request. E lwp-request sembra essere questo . Non sono sicuro di come ci sono arrivato (non di sicuro manualmente), se per impostazione predefinita è tutto lì. Sembra che ci sia un minuscolo usr/bin/head pure .
Frank Nocke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.