2011-08-29 42 views
8

Tôi đang cố gắng viết một kịch bản nhỏ đơn giản để truy vấn kết nối 3g và nếu kết nối đã bị ngắt, hãy kích hoạt kết nối lại.Tại sao so sánh chuỗi bash của tôi với hai chuỗi giống hệt nhau luôn sai?

Vấn đề của tôi là kiểm tra đầu ra của lệnh - hai chuỗi có vẻ bằng nhau không được đánh giá là bằng nhau. Tôi chắc rằng có một lỗi noob ở đây đâu đó!

#!/bin/bash 

echo "Checking connection" 
a="Not connected." 
b=$(./sakis3g status --console) 

if [[ "$a"!="$b" ]]; then 
    echo "Strings not equal:" 
    echo "$a" 
    echo "$b" 
else 
    echo "Strings equal!!" 
fi 

Kết quả khi chạy:

[email protected]:~$ ./test_3g.sh 
Checking connection 
Strings not equal: 
Not connected. 
Not connected. 

Khi chạy ./test_3g.sh | cat -A:

[email protected]:~$ ./test_3g.sh | cat -A 
Checking connection$ 
Strings not equal:$ 
Not connected.$ 
Not connected.$ 
+0

Không có dòng mới không liên quan ở cuối, phải không? – Mehrdad

+2

Thử './test_3g.sh | mèo -A'. Nếu 'cat' của bạn không hỗ trợ tùy chọn' -A', hãy thử './test_3g.sh | cat -v'. –

+0

Tôi không nghĩ rằng có bất kỳ khoảng trắng không liên quan nào, nhưng sẽ rất vui khi được sửa chữa trên đó. @Keith, tôi đã thêm đầu ra từ đường ống vào cat -A cho câu hỏi. – jozzas

Trả lời

25

Bạn có phải đặt chỗ xung quanh các nhà khai thác:

if [[ "$a" != "$b" ]]; then ... 

Nếu không có không gian bạn kết thúc với một chuỗi duy nhất, tương đương với "$a!=$b". Và thử nghiệm chỉ một chuỗi trả về true nếu chuỗi đó không trống ...

+0

Cảm ơn, tôi biết nó sẽ là một lỗi noob ... – jozzas

+1

Bạn đánh bại tôi với điều đó bằng 15 giây! –

+3

Không có khoảng trống, biểu thức là một chuỗi duy nhất '" Không được kết nối.! = Không được kết nối. "'. Như một biểu thức bash, một chuỗi được coi là đúng nếu độ dài của nó không khác; '[[STRING]]' tương đương với '[[-n STRING]]'. ('info bash', tìm kiếm' \ [\ [', sau đó theo ghi chú" Bash Biểu thức Điều kiện ".) –

0

lẽ sakis3g nhắn chương trình in để thiết bị lỗi chuẩn thay vì stdout. Trong trường hợp này, bạn so sánh thông điệp của mình với chuỗi rỗng. Cố gắng chuyển hướng stderr để stdout:

b=$(./sakis3g status --console 2>&1) 
+0

Không, điều đó đã không làm điều đó, xin lỗi! Tôi nhận được kết quả được lưu trữ trong 'b' có hoặc không có sự bổ sung của bạn. – jozzas

5

Sử dụng case/esac. Nếu bạn không phải gây rối với các sắc thái nitty gritty của if/else 's

case "$a" in 
"$b") echo "ok";; 
*) echo "not ok";; 
esac 
Các vấn đề liên quan