2017-02-15 14 views
7

Tôi đang đấu tranh để xem lý do tại sao sau đây được trở về một bộ quy tắc 1.Linux mã grep trở

echo 'Total' | grep -c No 
0 

Vì vậy, "Không" không tồn tại trong "Tổng". Nhưng sau đó tìm kiếm mã trả lại của tôi tôi thấy nó là 1.

echo $? 
1 

Tại sao mã trả lại hiển thị là 1? Có cách nào để giải quyết vấn đề này không?

+0

'grep' sẽ trả lại không chỉ khi một số chuỗi được khớp. quy tắc này cũng có thể áp dụng cho 'grep -c'. –

Trả lời

7

Theo man grep trang, -c cờ là dành cho

-c, --count Suppress ra bình thường; thay vào đó in một số dòng phù hợp cho mỗi tệp đầu vào.

Vì vậy, những gì bạn thấy là số lượng đối sánh và không bị nhầm lẫn với mã thoát của trận đấu grep. Mã số 1 là do không có dòng nào khớp với đầu vào.

Có xem xét các trường hợp khác,

echo 'No' | grep -c No 
1 

echo $? 
0 

Ngoài ra để đọc trên EXIT CODES trên man grep trang,

EXIT TÌNH TRẠNG Thông thường tình trạng thoát là 0 nếu một dòng được chọn, 1 nếu không có dòng nào được chọn và 2 nếu xảy ra lỗi.

6

Mã thoát là 1 vì không có gì khớp với grep.

EXIT STATUS Trạng thái thoát là 0 nếu tìm thấy các dòng được chọn và 1 nếu không tìm thấy. Nếu một lỗi xảy ra tình trạng thoát là 2. (Lưu ý: POSIX lỗi xử lý mã nên kiểm tra '2' hoặc lớn hơn.)

Đầu ra là zero vì tội danh 'Tổng' là zero. Điều này do tùy chọn -c:

-c, --count Ngăn chặn đầu ra bình thường; thay vào đó in số lượng các dòng phù hợp cho mỗi tệp đầu vào. Với tùy chọn -v, --invert-match (xem bên dưới), đếm các dòng không khớp. (-c được chỉ định bởi POSIX.)

Nếu bạn muốn ép mã thoát 0, bạn chỉ có thể nối thêm || đúng với lệnh của bạn: echo 'Total' | grep -c Không || true