Lệnh kiểm tra trong unix không in một đầu ra


20

Khi tôi gõ cái này trong terminal

test 4 -lt 6

Tôi không nhận được bất kỳ đầu ra. Tại sao không? Tôi cần 0 hoặc 1


1
Sẽ không hay sao nếu 'test' có tùy chọn xuất giá trị ngay lập tức? Chỉ là tùy chọn. Đó là tất cả những gì chúng ta cần.
Todd Walton

Câu trả lời:


15

Bạn nhận được 0 hoặc 1. Trong mã thoát.

bash-4.2$ test 4 -lt 6

bash-4.2$ echo $?
0

bash-4.2$ test 4 -gt 6

bash-4.2$ echo $?
1

Cập nhật : Để lưu mã thoát để sử dụng sau, chỉ cần gán nó cho một biến:

bash-4.2$ test 4 -lt 6

bash-4.2$ first=$?

bash-4.2$ test 4 -gt 6

bash-4.2$ second=$?

bash-4.2$ echo "first test gave $first and the second $second"
first test gave 0 and the second 1

1
Có cách nào để thoát mã thoát?
indieman

3
Không. Chỉ có đầu ra có thể được chuyển hướng. Dù sao, thường là không cần điều đó. Để lưu trữ nó để sử dụng sau này, chỉ cần gán nó cho một biến. Hoặc cho chúng tôi biết chính xác ý định của bạn với giá trị đó là gì.
manatwork

2
Mã thoát được đặt vào $?biến - ít nhất là cho đến khi nó bị ghi đè bởi lệnh tiếp theo bạn thực thi.
Shadur

1
PS: Bạn có thể sử dụng các $PIPESTATUSmảng để có được kết quả của nhiều lệnh trong một đường ống. $?sẽ do là kết quả của sự cuối cùng lệnh trong các đường ống dẫn nếu các pipefailtùy chọn tắt (mặc định).
l0b0

@indieman, nếu những gì bạn cần là làm một cái gì đó khác dựa trên trạng thái thoát, bạn thậm chí không cần phải lưu nó mà chỉ cần sử dụngif test 4 -lt 6; then echo test succeeeded; else echo test failed; fi
Wildcard

5

Một cách khác là

test 4 -lt 6 && echo 1 || echo 0

Nhưng hãy cẩn thận trong trường hợp đó. Nếu testtrả về thành công và echo 1thất bại echo 0sẽ được thực thi.


2

Nếu bạn muốn kết quả so sánh trên tiêu chuẩn thay vì mã thoát, bạn có thể sử dụng expr(1)lệnh:

$ expr 4 '<=' 6
1

Hai điều cần lưu ý:

  1. bạn có thể sẽ cần phải trích dẫn toán tử vì rất nhiều trong số chúng xung đột với các siêu ký tự shell
  2. giá trị đầu ra ngược lại với mã trả về cho test. testtrả về 0 cho true (là tiêu chuẩn cho mã thoát), nhưng exprin 1 cho đúng.

1
3. Có một testvỏ dựng sẵn, nhanh hơn đáng kể (khoảng 50 lần trên máy của tôi) so với testexprthực thi từ gói coreutils .
manatwork

+1 cho điểm thứ hai. Có thể nhận được một lỗi rất khó tìm nếu bạn làm hỏng nó.
Emanuel Berg

2

Bạn có thể gõ lệnh sau:

echo $(test -e myFile.txt) $?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.