2010-10-13 56 views
7

Trong kịch bản bashTừ khóa “if” sẽ kiểm tra xem giá trị có đúng là sai không?

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

Output: Yes

Nó đại diện cho rằng '1' được xử lý giá trị là đúng.

Nhưng trong mã:

word = Linux 
letter = nuxi 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

Output: Không

Nhưng echo "$word" | grep -q "$letter" sẽ trở lại 1, tại sao kết quả là số

cách từ khóa if kiểm tra giá trị trả về bởi lệnh sau if?

+0

Bạn có thể tìm thấy [câu trả lời của tôi ở đây] (http://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var/3870055 # 3870055) hữu ích. –

Trả lời

8

Giá trị trả về của một lệnh được chọn. [ 1 ] có giá trị trả lại là 0 (đúng). Bất kỳ giá trị trả lại nào khác (như 1) đều cho biết lỗi.

Bạn có thể hiển thị giá trị trả về của lệnh thực thi cuối cùng bằng cách sử dụng $? biến:

true 
echo $? 
# returned 0 
false 
echo $? 
# returned 1 
echo $? 
# returned 0 as the last executed command is 'echo', and not 'false' 
+0

À, có phải vì '[' là một nội trang hệ vỏ, nó sẽ trả về 0 khi nó hoàn thành chức năng kiểm tra? –

+0

Dường như '0' là một biểu thức đánh giá thành' true'. '[0 = 1]' có giá trị trả về '1' (giá trị kỳ vọng) và' [0 = 0] 'có giá trị trả về' 0'. Chạy 'man test' để biết thêm thông tin về' test' (aka '[') – Lekensteyn

+3

'[1]' hoặc '[0]' ước lượng là true vì 'test' /' ['với tham số đơn giản kiểm tra chuỗi tham số (ở đây '1' hoặc' 0') không trống.iow '[" "]' sẽ là sai. – Dummy00001

0

này được vì grep thất bại trong việc tìm ra thư $ trong $ word, do đó mã thoát là 1. Bất cứ khi nào một quá trình trong linux trả về một mã khác 0 thì nó có nghĩa là nó không thành công. 0 có nghĩa là đã thoát thành công. Bạn có thể xác minh điều này bằng cách echo "Linux" | grep -d "nuxi"; echo $?

Mặt khác trong thế giới kịch bản 0 có nghĩa là sai và 1 có nghĩa là đúng. Vì vậy, grep thất bại trong việc tìm kiếm từ và gửi 1 như là một mã thoát ra nếu, lấy nó như là một giá trị thực sự.

7

Trong đất unix, 0 là true và 1 là false.

Ví dụ đầu tiên của bạn:

if [ 1 ] 
then 
    echo "Yes" 
else 
    echo "No" 
fi 

"Nếu" kiểm tra mã lối ra của lệnh đưa ra cho đúng/sai (ví dụ: không/không).

Dấu ngoặc vuông thực sự gọi lệnh "kiểm tra" (xem "kiểm tra người đàn ông" để biết thêm thông tin) và cung cấp mã thoát cho nếu.

"kiểm tra 1" (hoặc thực sự "kiểm tra any_string") trả về true (0) vì vậy "Có" là đầu ra.

Ví dụ thứ hai, kết quả đầu ra "Không" vì "nuxi" không được tìm thấy trong "Linux", nếu bạn thay đổi "nuxi" thành "nux" (có thể đây là lỗi đánh máy?) Và xóa khoảng trắng xung quanh the = sau đó bạn sẽ nhận được hành vi mà bạn mong đợi. ví dụ.

word=Linux 
letter=nux 
if echo "$word" | grep -q "$letter" 
then 
    echo "Yes" 
else 
    echo "No" 
fi 
Các vấn đề liên quan