2012-05-14 60 views
19

Tôi đang viết một tập lệnh shell rất đơn giản có thể xem nhật ký của tất cả các kiểm tra không thành công và in ra tất cả tên của tất cả các tệp trong thư mục hiện tại trong nhật kýKiểm tra đầu ra của lệnh trong tập lệnh shell

1 #! /bin/sh 

2 for file in * 
3 do 
4  echo "checking: $file" 
5  if [$(grep $file failed.txt -c) -ne 0] 
6  then 
7   echo "$file FAILED" 
8  fi 
9 done 

Khi tôi thực hiện nó, tôi nhận được lỗi này:

line 6: [0: command not found 

có ai có bất kỳ ý tưởng tại sao?

Cảm ơn !!

+0

Bạn muốn di chuyển - ne để bắt đầu if-statement – keyser

+4

bạn đang thiếu một khoảng trống: '' if [$ (grep $ fi le failed.txt -c) -ne 0] '' – redShadow

Trả lời

25

[ thực sự là một lệnh trong linux (như bash hoặc cat hoặc grep).

$(grep $file failed.txt -c) là lệnh thay thế trong trường hợp của bạn được đánh giá là 0. Do đó, dòng bây giờ đọc [0 -ne 0], được hiểu là chạy chương trình có tên [0 với đối số -ne 0].

Điều bạn nên viết thay vì là [ $(grep $file failed.txt -c) -ne 0 ]. Shell script yêu cầu phải có khoảng trống giữa dấu ngoặc vuông mở và đóng. Nếu không, bạn thay đổi lệnh được thực thi (việc đóng ] cho biết rằng không còn đối số nào để đọc.

Bây giờ, bạn có thể thử thực hiện điều này trong trình bao để xem điều gì xảy ra. với giá trị là 0 nếu biểu thức đúng và 1 nếu cụm từ này là sai. Bạn có thể thấy giá trị thoát bằng cách lặp lại $? (giá trị thoát của lệnh cuối cùng sẽ được chạy)

+0

Bạn vẫn nên tránh sử dụng Backticks vô dụng. http://partmaps.org/era/unix/award.html#backticks (hãy xem ví dụ riêng biệt). – tripleee

+0

@tripleee Lời khuyên tốt, nhưng tôi sẽ không nói đặc biệt có liên quan trong trường hợp này vì đầu ra của grep trong trường hợp này có thể sẽ nhỏ hơn so với ARG_LIMIT. Mặc dù như một người nào đó đã chỉ ra trong một bình luận khác 'nếu grep $ file failed.txt -q' là giải pháp lý tưởng. Tôi thường không quan tâm đến việc sử dụng chuyển hướng đầu ra khi chúng làm cho các tập lệnh khó đọc hơn (nhiều mã thông báo hơn cho tôi đọc và xử lý). – Dunes

+0

Ồ, tuyệt đối; 'nếu grep -q' là thứ tôi cũng nhận được. (Bạn dường như có mẫu tìm kiếm và đối số tập tin bị đảo ngược?) – tripleee

6

Thay vì kiểm tra số, bạn có thể kiểm tra mã trả lại của grep:

if grep -q $file failed.txt &>/dev/null 
+0

Vâng, bạn luôn có thể một dòng toàn bộ tập lệnh. 'mèo thất bại.txt | xargs ls -f1 2>/dev/null' – Dunes

+3

Bạn thu được một chút hiệu quả bằng cách sử dụng 'grep -q' - nếu có kết quả khớp, grep thoát ngay lập tức. –

+1

Lưu ý rằng chuyển hướng '&>' không phải là posix. Bash sẽ giải thích nó giống như '>/dev/null 2> & 1', nhưng không phải tất cả các shell sẽ. (ví dụ, dấu gạch ngang sẽ gọi grep trong nền và cắt ngắn/dev/null) –

1

Các kịch bản có thể

#!/bin/sh 

for file in *; do 
    echo "checking: $file" 
    grep failed.txt $file && echo "$file FAILED" 
done 

hoặc, như là một one-liner trong sử dụng lịch sử lệnh shell:

for file in *; do { echo "checking: $file" && grep failed.txt $file && echo "$file FAILED"; done

trong man grep

EXIT STATUS
The exit status is 0 if selected lines are found, and 1 if not found. If an error occurred the exit status is 2. (Note: POSIX error handling code should check for '2' or greater.)

Các vấn đề liên quan