Cách thực hiện một câu lệnh if từ kết quả của lệnh đã thực thi


54

Tôi đang cố gắng thực hiện một câu lệnh IF từ đầu ra của một cam kết thực thi. Đây là cách tôi đang cố gắng để làm điều đó, nhưng nó không hoạt động. Có ai biết cách đúng để làm điều này?

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

Câu trả lời:


65

Sử dụng [[cấu trúc điều kiện bash và thích quy ước thay thế lệnh $(<lệnh> ). Ngoài ra, [[ngăn phân tách từ của các giá trị biến do đó không cần trích dẫn bit thay thế lệnh ..

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

30

Một cách khác là chỉ cần kiểm tra trạng thái thoát của grepchính nó, nó sẽ trả về false (1) nếu không có kết quả khớp và đúng (0) nếu có, bằng cách không sử dụng [lệnh.

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

Việc chuyển hướng đến / dev / null là để ngăn nó cũng in dòng tìm thấy ra màn hình.


12
Lưu ý -qtùy chọn grep thay vì chuyển hướng đến / dev / null. Với -q, grep không xuất bất cứ thứ gì và ngừng tìm kiếm sau trận đấu đầu tiên.
Stéphane Chazelas

5

Thậm chí đơn giản hơn,

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

Nếu bạn chỉ muốn làm một điều.


4

Bạn có thể làm chính xác hơn, nhưng đơn giản, phù hợp với awk.

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

Để khớp với cấu trúc của lệnh của bạn chặt chẽ hơn, cách di động thực hiện khớp ký tự đại diện trên một chuỗi trong một vỏ là với casecấu trúc.

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

0

Một ví dụ thực tế khác :)

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

Không gì HEADlàm gì? Đó có phải là một chức năng tùy chỉnh hoặc bí danh trên hệ thống của bạn?
luckman212

usr/bin/HEAD → lwp-request. Và lwp-request dường như là cái này . Không chắc chắn, làm thế nào tôi đến với nó (không chắc chắn bằng tay), nếu tất cả đều ở đó theo mặc định. Có vẻ như một chữ thường usr/bin/head cũng .
Frank Nocke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.