Bash: Câu lệnh If / Else trong một dòng


204

Tôi đang cố kiểm tra xem một tiến trình (giả sử nó được gọi some_process) có đang chạy trên máy chủ không. Nếu có, thì echo 1, nếu không thì echo 0.

Đây là lệnh mà tôi đang sử dụng nhưng nó chỉ hoạt động một phần (thông tin thêm bên dưới). Lưu ý rằng tôi cần viết kịch bản trong một dòng.

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

Lưu ý: Việc [s]trong some_proces[s]là để ngăn greptrở lại chính nó.

Nếu some_processđang chạy, sau đó "1"được lặp lại, đó là tốt. Tuy nhiên, nếu some_processkhông chạy, không có gì được lặp lại.


4
Bạn có thể sử dụng ps -Ccmdđể tìm các tiến trình có tên lệnh là "cmd", có thể loại bỏ hoàn toàn grep. pssẽ đặt mã thoát thành một số giá trị khác không nếu không tìm thấy quy trình khớp.
13 lúc 3:27

Câu trả lời:


273

Không cần phải kiểm tra rõ ràng $?. Cứ làm đi:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

Lưu ý rằng điều này phụ thuộc vào tiếng vang không thất bại, điều này chắc chắn không được đảm bảo. Một cách đáng tin cậy hơn để viết này là:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi

9
Nếu echo 1thất bại, sau đó echo 0sẽ được thực hiện. Trong trường hợp này, echo 1 sẽ không bao giờ thất bại, nhưng Lưu ý rằng A && B || C không phải là nếu-thì-khác. C có thể chạy khi A đúng. (Từ shellcheck ).
schemacs

@schemacs đưa ra một điểm rất hợp lệ: chỉnh sửa để cung cấp một sự thay thế tốt hơn nhiều.
William Pursell

2
Có cần thiết phải chuyển hướng đầu ra của lệnh ps vào một tệp không? Điều này sẽ không làm việc? if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi. Tại địa phương nó dường như làm việc cho tôi. Có phải vì OP đã chuyển hướng trong lệnh mà anh ta đã thử?

1
Hoàn toàn không cần phải chuyển hướng đầu ra. Tôi chỉ đơn thuần là vượn vị trí ban đầu, vì tôi cho rằng đầu ra đang được lưu vì một lý do. Thường thì loại điều này chỉ bị triệt tiêu (có grep -qhoặc chuyển hướng đến / dev / null).
William Pursell

Tôi sẽ sử dụng pgrep.
pawciobiel 5/2/2016

67

&&có nghĩa là "và nếu thành công"; bằng cách đặt ifcâu lệnh của bạn ở phía bên phải của nó, bạn đảm bảo rằng nó sẽ chỉ chạy nếu greptrả về 0. Để sửa nó, sử dụng ;thay thế:

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(hoặc chỉ sử dụng ngắt dòng).


6
+1 Đây là một câu trả lời tốt hơn nhiều, vì nó thực sự trả lời câu hỏi trái ngược với việc chỉ cung cấp một giải pháp thay thế.
William Pursell

41

Sử dụng grep -vcđể bỏ qua greptrong psđầu ra và đếm các dòng đồng thời.

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi

15

Bạn có thể sử dụng đầy đủ các toán tử &&||toán tử như thế này:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

Để loại trừ grep chính nó, bạn cũng có thể làm một cái gì đó như:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0

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.