`$?` Là gì? Có phải là một biến?


23

Câu hỏi là khá thẳng về phía trước. Tôi có thể lấy mã thoát của lệnh trước bằng cách sử dụng $?. Nhưng chính xác là nó?

Tôi không nghĩ đó là một biến, bởi vì bạn không thể có bất kỳ ký tự đặc biệt nào trong tên của biến khác ngoài _.

foo?foo=10

sẽ dẫn đến lỗi: foo?foo=10: command not found

Vì vậy, nếu nó không phải là một biến, nó là gì? Có những người khác thích nó?


Câu trả lời:


23

Nó là gì?

$? là một biến tích hợp lưu trữ trạng thái thoát của lệnh, hàm hoặc chính tập lệnh.

$?đọc trạng thái thoát của lệnh cuối cùng được thực thi. Sau khi một hàm trả về, $?đưa ra trạng thái thoát của lệnh cuối cùng được thực thi trong hàm. Đây là cách Bash đưa ra các hàm "giá trị trả về". Nó trả 0về thành công hoặc một số nguyên trong phạm vi 1 - 255lỗi.

Có những người khác cũng thích nó?

Có, có một số biến tích hợp như vậy trong bash. Bạn có thể xem một danh sách ở đây . Tham khảo: http://www.tldp.org/LDP/abs/html/exit-status.html


1
Vì vậy, nó chỉ có sẵn trong bash shell?
daltonfury42

4
@ daltonfury42 không, bất kỳ vỏ rằng nỗ lực để có một số khả năng tương thích với vỏ Bourne sẽ hỗ trợ nó (bao gồm dash, ksh, zsh, trong số những người khác).
muru

2
csh và cá sử dụng $statuscho cùng một mục đích
glenn jackman

22

$?là một biến nhưng là một biến đặc biệt, đó là lý do tại sao các ký tự đặc biệt được phép. ($?)Mở rộng đến trạng thái thoát của đường ống tiền cảnh được thực hiện gần đây nhất.

Nó không phải là duy nhất, vỏ xử lý một số thông số đặc biệt. Các thông số này chỉ có thể được tham chiếu; giao cho họ không được phép:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

Nguồn:


2
"$*"không chỉ là tất cả các tham số vị trí như một từ đơn lẻ, mà tất cả các tham số vị trí được phân tách bằng ký tự đầu tiên IFSlà một từ đơn. Vì kết quả sẽ chịu sự phân tách trường nếu không được trích dẫn, nên hiệu ứng như thể $@được sử dụng trong trường hợp không trích dẫn.
muru

1
Để chắc chắn: không trích dẫn $ @ và $ * là như nhau bởi vì cả hai đều là đối tượng để tách từ. Được trích dẫn, "$ @" duy trì việc tách từ của các tham số vị trí, ngay cả khi một tham số riêng lẻ chứa một ký tự trong IFS.
kojiro

1
Có một tài liệu tham khảo từ khi đó được sử dụng cho đạn pháo? Tôi tự hỏi nếu Perl lấy những người từ kịch bản shell.
simbabque

Điều này có trước Perl hàng thập kỷ (hoặc ít nhất là nhiều năm). Rất nhiều cú pháp Perl bị ảnh hưởng bởi cú pháp shell. (Perl được sinh ra vào năm 1987, và rất nhiều cú pháp này xuất phát từ vỏ Bourne gốc (1977) Tôi không phải là 100% khi $ _ đã được giới thiệu, nhưng nó đã gần như chắc chắn cũng trước năm 1987..
Popup

6

$?là một tham số shell đặc biệt (biến).

Nói chung, tất cả các biến do người dùng xác định phải được đặt tên bằng cách chỉ sử dụng các ký tự từ lớp ký tự [:alnum:]tức là [a-zA-Z0-9_](cũng không thể bắt đầu bằng [0-9]).

Tóm lại, $?là một biến đặc biệt ( và có khá nhiều trong số này ) có thể được coi là tính năng bên trong của chính vỏ cung cấp mã thoát của lệnh trước đó (cho dù bị hủy bỏ hay thất bại).

Bạn có thể đọc điều này để có thêm ý tưởng về các biến.


4

$?là một biến đặc biệt trong bash luôn giữ mã trả về / thoát của lệnh được thực thi cuối cùng.

Bạn có thể xem nó trong một thiết bị đầu cuối bằng cách chạy echo $?.

Mã trả về nằm trong phạm vi [0; 255].
Mã trả về 0thường có nghĩa là mọi thứ đều ổn.
Các giá trị khác chỉ ra lỗi. Hầu hết các ứng dụng trả về 1hoặc giá trị tùy chỉnh. Nếu một lệnh không được tìm thấy, biến thường chứa127

Nếu bạn muốn đặt biến này thành một giá trị cụ thể, bạn có thể dễ dàng thực hiện điều này với bash -c "exit 5"để trả về ví dụ mã trả về 5.


Hàm shell là một cách tuân thủ POSIX để đặt trạng thái thoát mà không nhất thiết phải chuyển. setstatus() { return 5; }
kojiro
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.