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 đó?
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:
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"; }
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 -l
trả 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.
Này không bao gồm tất cả các test
trường hợp, nhưng nếu bạn có thể sử dụng một biểu thức chính quy, và grep
chuỗi đường ống, nó khá thẳng về phía trước vì grep
là test
-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.