Tùy chọn -z trong lệnh thử nghiệm (linux) là gì


3

Trong một trong những hướng dẫn trong phòng thí nghiệm của tôi có một lệnh cần kiểm tra.

test -z $LOGNAME || echo Logname is not defined

Khi tôi thực hiện lệnh này, đầu ra là "Tên đăng nhập không được xác định". Trang man để kiểm tra nói

> -z STRING
>               the length of STRING is zero

khi tôi lặp lại $ LOGNAME, nó sẽ in tên đăng nhập của tôi. Vì vậy, có một giá trị cho $ LOGNAME. Trong lệnh đầu tiên ở trên vì phần bên phải của lệnh được thực thi, nó ngụ ý phần bên trái đã trả về false. Tại sao nó trả về false khi $ LOGNAME có giá trị?


1
Có một sự khác biệt lớn giữa "độ dài bằng không" và "không xác định". STRING='' định nghĩa một chuỗi có độ dài bằng không. Các -z tùy chọn để kiểm tra không phân biệt giữa độ dài không xác định hoặc không.
William Pursell

thanx cho thông tin đó William
DesirePRG

Câu trả lời:


4

Dòng

test -z $LOGNAME || echo Logname is not defined

là một Danh sách HOẶC và có thể được dịch là:

LÀM echo Logname is not defined NẾU test -z $LOGNAME FAILS

Như bạn đề cập trong câu hỏi của bạn, test -z $LOGNAME kiểm tra xem $LOGNAME là độ dài bằng không ... và vì không phải vậy, bài kiểm tra thất bại. Thay thế || với && như sau sẽ cung cấp cho bạn hành vi bạn muốn:

test -z $LOGNAME && echo Logname is not defined

CHỈNH SỬA : Theo nhận xét của William Pursell bên dưới, test -n (kiểm tra chuỗi có độ dài khác không) và || có thể có ý nghĩa khái niệm hơn, nhưng bạn cần trích dẫn $LOGNAME trong trường hợp này (và trên thực tế, đó là một ý tưởng tốt để tập thói quen trích dẫn các biến nói chung):

test -n "$LOGNAME" || echo Logname is not defined

cảm ơn bạn. Tôi không thể hiểu tùy chọn -z làm gì trước đây. Bây giờ tôi đã hiểu.
DesirePRG

Vì vậy, shell sẽ trả về 1 cho thất bại và 0 cho thành công. Điều gì ngược lại so với các ngôn ngữ khác? nếu chúng ta nghĩ như vậy. Thật khó hiểu vì nếu phần bên trái được ước tính là 1 thì phần bên phải không được thực thi
DesirePRG

1
@DesirePRG Có, trạng thái thoát là 0 biểu thị thành công - đó không phải là giá trị boolean. Các lệnh có thể trả về bất kỳ trạng thái thoát nào từ 0 đến 255, được sử dụng để thông báo cho người dùng / các chương trình khác loại lỗi xảy ra (trong đó "0" là "không có lỗi").

2
Bạn phải cẩn thận với trích dẫn. test -n $foo là một thảm họa đang chờ xảy ra bởi vì nó sẽ thành công nếu foo không được xác định, nhưng không phải nếu foo có độ dài bằng không. test -z $foo hoạt động như mong đợi (nghĩa là nó thành công cả khi foo không xác định và khi nào foo có độ dài bằng không), nhưng nên sử dụng test -z "$foo" và tránh trường hợp bệnh lý. ( test -z $foo thành công khi foo không được xác định vì chuỗi -z không trống.)
William Pursell

@WilliamPursell Bắt tốt - Tôi đã thêm một chút vào câu trả lời cho mỗi nhận xét của bạn.

0

Lệnh kiểm tra tìm tệp được đề cập trong thư mục hiện tại, Nếu bạn muốn kiểm tra tệp từ một vị trí khác cung cấp đầy đủ đường dẫn và không sử dụng tùy chọn -z hoặc tùy chọn -s. Bạn có thể làm như dưới đây:

kiểm tra / usr / bin / tên đăng nhập & amp; & amp; tiếng vang $ LOGNAME | | Tên đăng nhập không được xác định

hoặc là

kiểm tra -s / usr / bin / tên đăng nhập & amp; & amp; tiếng vang $ LOGNAME | | Tên đăng nhập không được xác định


1
Đề nghị bạn đọc lại câu hỏi ...

Theo bạn nếu 'test -z $ LOGNAME & amp; & amp; Tên đăng nhập echo không được xác định 'là chính xác, sau đó nó in ra kết quả của' test -z $ LOGNAME & amp; & amp; tiếng vang $ LOGNAME | | Tên đăng nhập không được xác định 'nên đầu ra chính xác. Dù sao cũng cảm ơn lời đề nghị của bạn.

Không - bạn không hiểu làm thế nào test -z công trinh. Hãy thử nó cho chính mình.
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.