Làm thế nào tôi có thể sử dụng giá trị từ một đường ống trong chương trình thử nghiệm?


10
wc -l | test -eq 1

Điều này không hoạt động. Tôi muốn so sánh kết quả của wc với giá trị của 1. Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


8

Nó không trả lời câu hỏi của bạn về đường ống, nhưng bạn có thể sắp xếp lại:

test $(ls -l | wc -l) -eq 1 && echo "worked"

Và có một vài giải pháp về SO , đây là cách tốt nhất:

ls -l | wc -l | { read wc; test $wc -eq 7 && echo "woohoo"; }

4

Nếu bạn đang sử dụng Bash, có lẽ bạn muốn nghiên cứu biến PIPESTATUS. Như đã lưu ý trong hướng dẫn tham khảo Bash , PIPESTATUS là

Một biến mảng (xem Mảng) chứa danh sách các giá trị trạng thái thoát khỏi các quy trình trong đường ống tiền cảnh được thực hiện gần đây nhất (có thể chỉ chứa một lệnh).

Chúng tôi có thể tìm ra những mã thoát nào cho đường ống này với PIPESTATUS:

dmesg | grep -iw 'nnse' | wc -l

Nếu bây giờ bạn truy vấn biến mảng, bạn sẽ nhận được các trạng thái thoát tham chiếu đến các lệnh được sử dụng trong đường ống:

echo ${PIPESTATUS[@]}
0 1 0

(Trong một mảng được lập chỉ mục, các mã thoát ở trên được biểu thị bằng 0 1 và 2 trong mảng vì các mảng luôn bắt đầu từ 0 trong Bash.)

Ở đây chúng ta thấy lệnh thứ hai trả về 1 và phần còn lại 0; tuy nhiên, wc -ltrả về 0 nếu không có kết quả trùng khớp, đây không phải là lỗi. Lỗi được biểu thị bằng một giá trị khác không và có các giá trị lỗi khác như 127 không tìm thấy lệnh và còn nhiều mã có thể dành riêng cho chương trình liên quan.

Nếu bạn muốn xem mã thoát của một lệnh cụ thể trong đường ống là gì, bạn chỉ có thể truy cập giá trị đó. Lệnh grep là lệnh thứ hai trong đường ống ở trên, nhưng khi các mảng bắt đầu từ 0, chúng ta cần nhập một.

Vì vậy, để tìm ra mã thoát của lệnh grep, hãy chạy lại đường ống trên (vì nội dung của PIPESTATUS sẽ bị cạn kiệt nếu bạn đã chạy echo ${PIPESTATUS[@]}) và sau đó thực hiện lệnh bên dưới, sẽ trả về 1 (mã thoát):

echo ${PIPESTATUS[1]}
1

Trong tập lệnh, đảm bảo đường ống đã thực hiện xong trước khi bạn tìm kiếm nội dung của biến mảng PIPESTATUS.

Để biết ví dụ về việc sử dụng biến mảng PIPESTATUS thú vị, hãy xem câu trả lời này liên quan đến việc kết hợp nhóm lệnh Bash và trạng thái đường ống . Bạn có thể kiểm tra biến mảng theo cách được đề xuất bởi Gilles trong các nhận xét, mặc dù trước tiên bạn sẽ cần chạy lại đường ống:

dmesg | grep -iw 'nnse' | wc -l
[ ${PIPESTATUS[1]} -eq 1 ] && do_something_here

Đây chỉ là một đoạn, vì tôi không biết bạn đang có ý định loại kịch bản nào, nhưng tôi hy vọng việc biết về PIPESTATUS có thể giúp ích cho bạn. Có nhiều biến mảng Bash như PIPESTATUS có thể cực kỳ hữu ích; xem hướng dẫn tham khảo Bash cho toàn bộ danh sách và các trang Stackexchange khác để biết ví dụ về việc sử dụng chúng.


1

Này không bao gồm tất cả các testtrường hợp, nhưng nếu bạn có thể sử dụng một biểu thức chính quy, và grepchuỗi đường ống, nó khá thẳng về phía trước vì greptest-like ở chỗ nó có khác không thoát khi không phù hợp được tìm thấy

cat file | wc -l | grep -qE '^\s*1\s*$'

Biểu thức chính quy mở rộng cho phép bạn bao quát nhiều trường hợp với kỹ thuật này. Đối với tiếng cười khúc khích, một trường hợp thử nghiệm:

for i in 1 11 '' foo; do 
  if echo $i | grep -qE '^\s*1\s*$'; then 
    echo "'$i' matched"
  else
    echo "'$i' didn't match."
  fi
done

đầu ra:

'1' matched
'11' didn't match.
'' didn't match.
'foo' didn't match.

1

Cách đơn giản nhất có lẽ là sử dụng xargs :

wc -l | xargs -I % test % -eq 1
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.