2012-01-15 38 views
5

Trong rất đơn giản theo gương ksh kịch bản, tôi cần phải hỏi xem kết quả Func1 bằng 4,ksh chức năng giá trị trả về trong ngoặc

Đây là những gì tôi đã làm trong ví dụ nhưng kịch bản này không in các "chức năng kết quả = 4 "như tôi mong đợi.

gì tôi cần phải thay đổi trong [[......]] để in các "kết quả chức năng = 4"

Ghi chú - Func1 phải nằm trong [[.... .]]

#!/bin/ksh 

    func1() 
    { 
    return 4 
    } 

    [[ ` func1 ` = ` echo $? ` ]] && print "function result = 4" 

Trả lời

10

Bạn cần

#!/bin/ksh 

    func1() 
    { 
    print -- 4 
    } 

    [[ $(func1) = 4 ]] && print "function result = 4" 

HOẶC

#!/bin/ksh 

    func1() 
    { 
    return 4 
    } 

    func1 ; [[ $? == 4 ]] && print "function result = 4" 

Có một số vấn đề trong mã mà bạn trình bày, vì vậy hãy để tôi cố gắng giải thích (Bạn đang làm cho nó phức tạp hơn mức cần thiết).

Số 1 là việc bạn sử dụng các dấu kiểm trước để thay thế lệnh, những điều này đã không được chấp nhận bằng ngôn ngữ ksh kể từ ~ 1995! Sử dụng $ (... cmd) để thay thế cmd hiện đại. Chúng ta thường thấy các dấu gạch chéo được liệt kê như một cái gật đầu về tính di động, nhưng chỉ các kịch bản được viết cho các hệ thống mà vỏ Bourne là chỉ có vỏ yêu cầu sử dụng các dấu gạch chéo ngược. (À, tôi không biết về dấu gạch ngang hay tro, vì vậy có thể cả những thứ đó nữa).

Không 2. đó là $? được thiết lập sau khi bao giờ chức năng hoặc lệnh hoặc đường ống được thực hiện và là mã trả về của lệnh cuối cùng. Đó là một giá trị từ 0-255. Khi bạn có mã như cmd ; rc=$? ; echo $?; bây giờ bạn đang lặp lại trạng thái của sự phân công của rc=$? (mà hầu như luôn luôn là 0), và đó là lý do tại sao bạn sẽ thấy những người viết kinh nghiệm tiết kiệm giá trị của $? trước khi làm bất cứ điều gì khác với nó.

Nhớ lại rằng lệnh-thay sử dụng những gì đã từng là sản phẩm của các $(... cmd ...) hoặc backtics lệnh kèm theo khi return đặt giá trị của $? (cho đến khi lệnh thực hiện rất cạnh resets giá trị đó).

Tôi hy vọng điều này sẽ hữu ích.

+0

Giải thích tuyệt vời @shellter. +1 –

+0

tnx @JaypalSingh; Trong thử nghiệm của tôi để viết câu trả lời của tôi, tôi cũng tình cờ gặp vấn đề rằng [[func1 = 4]] không nhận được giá trị trả về từ hàm. Bây giờ tôi nhận ra, như một bình luận đã bị xóa, rằng '[[...]]' sẽ chỉ đánh giá các giá trị văn bản, + so sánh ops + lệnh thay thế (có thể cả những người khác nữa), nhưng không có cách nào để trực tiếp thực hiện một func bên trong. – shellter

+0

Yea, @ruakh chỉ ra rằng trong câu trả lời của tôi mà tôi đã xóa như tôi đã có tất cả sai. Nhưng bây giờ đọc câu trả lời của bạn và bình luận của mình, nó làm cho rất nhiều ý nghĩa hơn bây giờ. –

4

chức năng không trả lại 4. các nhà điều hành ' `(backticks) bỏ qua các giá trị kết quả, và trả stdout của chức năng để thay thế (trong trường hợp của bạn một chuỗi rỗng, vì Func1 không in bất cứ điều gì để stdout) .

`echo $?` 

chỉ là quá phức tạp cách khác để nói

$? 
Các vấn đề liên quan