Ý nghĩa của $ là gì? trong một kịch bản shell?


Câu trả lời:



26

Câu trả lời của Cjm là chính xác, nhưng $?có thể được sử dụng theo những cách ngớ ngẩn trong các kịch bản shell, và tôi muốn cảnh báo chống lại điều đó. Rất nhiều tập lệnh shell xấu có mẫu mã lặp đi lặp lại:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Nếu có thể (lo ngại về khả năng đọc đôi khi xâm nhập), bạn nên mã hóa tình huống này theo cách khác:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

Cách sử dụng sau này nhanh hơn, không làm ô nhiễm không gian tên biến của shell với số lượng của biến temp, thường có thể dễ đọc hơn cho con người và khuyến khích sử dụng "logic tích cực", thực hành viết các điều kiện không có phủ định, có nhận thức đơn giản trong hầu hết các tình huống. Nó không đi với việc sử dụng $?cho hầu hết các phần.


5
Cú pháp phức tạp hơn là cần thiết khi có nhiều khả năng hơn chỉ 0 hoặc 1 - các chương trình thường truyền đạt thông tin hữu ích thông qua mã thoát. Và nó cũng hữu ích nếu bạn cần sử dụng lại giá trị đó sau này trong mã (ví dụ để ghi nhật ký).
mattdm

3

Ngoài những gì cjm đã nói , nếu giá trị bằng $?0, thì quá trình trước đó đã chấm dứt bình thường (hoặc thành công). Nếu không, đã có một số lỗi.


8
Nó không phải lúc nào cũng báo hiệu một lỗi. diffthoát với 0 nếu các tệp được so sánh là như nhau, với 1 nếu chúng khác nhau và 2 là lỗi.
Shawn J. Goff

2
không bao giờ báo hiệu một lỗi. Đây chỉ là trạng thái thoát của lệnh trước đó. Điều "0 nếu thoát bình thường" là một quy ước (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg

3

$?-Hình trạng thoát lệnh cuối cùng được thực thi.

$0Tên tệp của tập lệnh hiện tại.

$#-Số lượng đối số được cung cấp cho một tập lệnh.

$$-Số quá trình của vỏ hiện tại. Đối với tập lệnh shell, đây là ID tiến trình mà chúng đang thực thi.


0

$? cung cấp cho chúng tôi trạng thái thực thi của lệnh thực thi cuối cùng trên dấu nhắc. Giá trị '0' biểu thị rằng lệnh đã được thực hiện thành công và '1' không thành công.


2
Không chỉ tại các lời nhắc tương tác, mà trong các tập lệnh cũng vậy, và bất kỳ giá trị khác không nào cũng biểu thị sự thất bại.
Kusalananda

-3

$?xác định trạng thái thoát của lệnh được thực thi. $theo sau là các số (ví dụ $1, $2v.v.) đại diện cho các tham số trong tập lệnh shell.


Bạn có thể muốn đọc câu trả lời chính xác ...
jasonwryan
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.