2010-01-06 43 views
25

Có gì sai trong mã của tôi?Lỗi toán tử không mong muốn

#!/bin/sh 

LOOK_FOR="$1" 

for i in `find $2 -name "*jar"`; do 
    echo "Looking in $i ..." 
    #jar tvf $i | grep $LOOK_FOR > /dev/null 
    jar tvf "$i" | grep "$LOOK_FOR" 

    if [ $? == 0 ] ; then 
    echo "==> Found \"$LOOK_FOR\" in $i" 
    fi 
done #line 13 

Output

[email protected]:$ sh lookjar.sh org/apache/axis/message/addressing/EndpointReference /media/0C06E20B06E1F61C/uengine/uengine 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/build/uengine_settings.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/lib/FCKeditor/WEB-INF/lib/commons-fileupload.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/lib/FCKeditor/WEB-INF/lib/FCKeditor-2.3.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/defaultcompany/WebContent/uengine-web/processmanager/signedmetaworks.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/hsqldb/lib/hsqldb.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/hsqldb/lib/servlet.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/commons-discovery.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/google.jar ... 
[: 13: 1: unexpected operator 
Looking in /media/0C06E20B06E1F61C/uengine/uengine/src/lib/jxl.jar ... 

Trả lời

65

Bạn cần phải sử dụng = thay vì == trong dòng [ $? == 0 ].

+0

tại sao whats sự khác biệt? – kapitanluffy

+1

@kapitanluffy [Vì tiêu chuẩn nói như vậy.] (Http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html) Nó chỉ rõ những gì '=' làm, nhưng '==' không được đề cập ở tất cả và do đó không hợp lệ. –

+0

Ồ, đã bị nhầm lẫn vì tôi thấy các tập lệnh sử dụng '==' thay vì '=' – kapitanluffy

-1

Hãy thử:

if [[ $? == 0 ]]; then 
    echo "==> Found \"$LOOK_FOR\" in $i" 
fi 
+4

Đó là một bashism, và tôi biết từ thông báo lỗi được đăng rằng OP không sử dụng bash. :-P –

+0

Bắt đầu, một số distro có bash cho/bin/sh, FWIW của họ. Trong trường hợp này, tôi nghĩ rằng bash làm việc với '=' hoặc '==' để có thể xảy ra OP không sử dụng bash (và chỉ bash hỗ trợ '[[' style I think) FWIW. – rogerdpack

6

Bạn nên thay đổi điều đó để:

if [ $? -eq 0 ]; then 
    ... 

-eq làm một so sánh số.

Bạn cũng có thể tận dụng lợi thế của một thực tế rằng trong vỏ một giá trị trả về 0 được coi là thành công và viết mã của bạn như thế này:

if jar tvf "$i" | grep "$LOOK_FOR"; then 
    ... 
+1

Vâng, so sánh số hoặc chuỗi không thực sự quan trọng ở đây. – ephemient

+4

Chính xác là vấn đề của tôi. '==' chỉ hợp lệ trong ** bash ** nhưng tôi đã sử dụng ** sh **. – karlphillip

+0

sh thường chỉ là một liên kết tượng trưng đến một thông dịch viên khác. Tôi đã gặp vấn đề tương tự như OP, và tìm thấy trên cài đặt Ubuntu của tôi, sh chỉ vào dấu gạch ngang, mà tôi đoán sử dụng = để so sánh chuỗi. –

2
#!/bin/sh 
LOOK_FOR="$1"  
find $2 -name "*jar"`| while read -r file 
    echo "Looking in $file ..." 
    jar tvf "$file" | grep "$LOOK_FOR" 
    if [ $? -eq 0 ] ; then 
    echo "==> Found \"$LOOK_FOR\" in $file" 
    fi 
done 
Các vấn đề liên quan