2012-09-16 40 views
6

Tôi có một tập lệnh đơn giản để kiểm tra xem trang web có chứa một chuỗi được chỉ định hay không. Có vẻ như:Chuỗi Bash (đầu ra lệnh) kiểm tra bình đẳng

#!/bin/bash 
res=`curl -s "http://www.google.com" | grep "foo bar foo bar" | wc -l` 
if [[ $res == "0" ]]; then 
    echo "OK" 
else 
    echo "Wrong" 
fi 

Như bạn có thể thấy, tôi đang tìm cách "OK" nhưng bị "Sai".

Có vấn đề gì với nó?

Nếu tôi sử dụng nếu [$ res == "0"], nó hoạt động. Nếu tôi chỉ sử dụng res = "0" thay vì res = curl..., nó cũng có thể có được kết quả mong muốn.

Tại sao có những khác biệt này?

Trả lời

1

tôi tìm thấy câu trả lời trong glenn jackman 's trợ giúp.

tôi nhận được những điểm sau đây trong câu hỏi này:

  • wc -l 's đầu ra chứa khoảng trắng.
  • Gỡ lỗi với echo "$var" thay vì echo $var
  • [[ duy trì giá trị bằng chữ của tất cả các ký tự trong var.
  • [ mở rộng var đến giá trị của chúng trước khi thực hiện, đó là vì [thực ra là test cmd, vì vậy, nó tuân theo các quy tắc Shell Expansions.
16

Bạn có thể xem những gì res chứa: echo "Wrong: res=>$res<"

Nếu bạn muốn xem một số văn bản có chứa một số văn bản khác, bạn không cần phải nhìn vào dài sản lượng grep: bạn nên xem xét của grep mã trở lại:

string="foo bar foo bar" 
if curl -s "http://www.google.com" | grep -q "$string"; then 
    echo "'$string' found" 
else 
    echo "'$string' not found" 
fi 

Hoặc ngay cả khi không grep:

text=$(curl -s "$url") 
string="foo bar foo bar" 
if [[ $text == *"$string"* ]]; then 
    echo "'$string' found" 
else 
    echo "'$string' not found in text:" 
    echo "$text" 
fi 
+0

Cảm ơn, đó là giải pháp tốt. Nhưng, như câu hỏi của tôi, tôi chỉ muốn biết tại sao [[$ res == "0"]] không hoạt động trong trường hợp này, để tôi có thể tránh mắc sai lầm tương tự trong tương lai – kliu

+1

bạn thấy gì? -c <<< "$ res" '? Có các ký tự khoảng trống thừa nào không? –

+0

Có, bạn nói đúng, có khoảng trắng ở đầu ra wc. Cảm ơn. – kliu

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