Bagaimana melakukan pernyataan if dari hasil perintah yang dieksekusi


54

Saya mencoba untuk melakukan pernyataan IF dari output dari perintah yang dieksekusi. Inilah cara saya mencoba melakukannya, tetapi tidak berhasil. Adakah yang tahu cara yang tepat untuk melakukan ini?

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

Jawaban:


65

Gunakan [[konstruksi kondisional bash dan lebih suka konvensi substitusi perintah $(<command> ). Selain itu, [[mencegah pemisahan kata dari nilai variabel oleh karena itu tidak perlu mengutip bit perintah substitusi ..

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

30

Alternatif lain adalah dengan hanya menguji status keluar grepitu sendiri, yang akan mengembalikan false (1) jika tidak ada kecocokan dan benar (0) jika ada, dengan tidak menggunakan [perintah.

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

Pengalihan ke / dev / null adalah untuk mencegahnya juga mencetak baris yang ditemukan ke layar.


12
Perhatikan -qopsi untuk grep alih-alih mengarahkan ke / dev / null. Dengan -q, grep tidak menghasilkan apa pun dan berhenti mencari setelah pertandingan pertama.
Stéphane Chazelas

5

Lebih sederhana lagi,

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

Jika Anda hanya ingin melakukan satu hal.


4

Anda dapat melakukan lebih tepat, namun sederhana, cocok dengan awk.

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

Untuk mencocokkan struktur perintah Anda lebih dekat, cara portabel melakukan pencocokan wildcard pada string di shell adalah dengan casekonstruk.

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

0

Contoh dunia nyata lain :)

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

Apa yang HEADharus dilakukan Apakah itu fungsi khusus atau alias di sistem Anda?
luckman212

usr/bin/HEAD → lwp-request. Dan permintaan lwp tampaknya adalah yang ini . Tidak yakin, bagaimana saya sampai di sana (tidak secara manual pasti), jika semuanya ada di sana secara default. Ada tampaknya menjadi huruf kecil usr/bin/head juga .
Frank Nocke
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.