Các biến vỏ ký hiệu đô la đặc biệt là gì?


782

Trong Bash, dường như có một số biến chứa các giá trị đặc biệt, có ý nghĩa nhất quán. Ví dụ,

./myprogram &; echo $!

sẽ trả về PID của quá trình được tạo nền myprogram. Tôi biết về những người khác, như $?tôi nghĩ là TTY hiện tại. Có những người khác?


15
Một số trong số họ không chỉ Bash. Chúng cũng được sử dụng trong các shell khác liên quan đến Bourne và trên thực tế được chỉ định bởi POSIX .
Tạm dừng cho đến khi có thông báo mới.

1
Còn về: IFS = $ '\ n' Xem: stackoverflow.com/questions/4128235/
Kẻ

1
@sgu Đó không phải là một tham số; đó là một loại trích dẫn đặc biệt. $'\n'là một ký tự dòng mới theo nghĩa đen là kết quả của việc thay thế máy in \nbằng ASCII 10.
chepner

Nếu bạn đến đây tìm kiếm ${1}, ${*}, vv, trong dấu ngoặc là chỉ dành riêng cho định hướng, và thường không cần thiết. Trong sự cô lập, ${x}chính xác là tương đương với $x.
tripleee

$!nghĩa là gì? Tôi nhận thức được !$nhưng không phải vậy.
Sridhar Sarnobat

Câu trả lời:


1359
  • $1, $2, $3, ... là những tham số vị trí .
  • "$@"là một cấu trúc giống như mảng của tất cả các tham số vị trí , {$1, $2, $3 ...}.
  • "$*"là sự mở rộng IFS của tất cả các tham số vị trí , $1 $2 $3 ....
  • $# là số lượng tham số vị trí.
  • $- tùy chọn hiện tại được thiết lập cho shell.
  • $$ pid của shell hiện tại (không phải subshell).
  • $_ tham số gần đây nhất (hoặc đường dẫn abs của lệnh để khởi động shell hiện tại ngay sau khi khởi động).
  • $IFS là dấu phân cách trường (đầu vào).
  • $? là trạng thái thoát đường ống tiền cảnh gần đây nhất.
  • $! là PID của lệnh nền gần đây nhất.
  • $0 là tên của shell hoặc shell script.

Hầu hết những điều trên có thể được tìm thấy dưới Thông số đặc biệt trong Hướng dẫn tham khảo Bash. Có tất cả các biến môi trường được thiết lập bởi shell .

Để có một chỉ mục toàn diện, vui lòng xem Chỉ mục biến thủ công tham khảo .


2
Tất cả đều được ghi lại trong bashtrang người đàn ông. Điều kỳ lạ duy nhất $_là chỉ được đề cập trong bối cảnh sử dụng của nó trong MAILPATHbiến.
chepner

4
@chepner nhìn ở man(1) bashdưới thông số đặc biệt cho phần còn lại của định nghĩa của $_.
kojiro

8
Tôi sử dụng !$thay vì $_trong các tập lệnh bash, vì sau này đôi khi không thành công.
amc

Danh sách đẹp kojiro. Tôi đã chạy qua cú pháp này $ {1 + "$ @"} điều đó có nghĩa là gì?
dùng178047

3
@amc: Xem unix.stackexchange.com/questions/271659/ Khăn để biết sự khác biệt giữa !$$_.
tricasse

44
  • $_ đối số cuối cùng của lệnh cuối cùng
  • $# số lượng đối số được truyền cho tập lệnh hiện tại
  • $*/ $@danh sách các đối số được truyền cho tập lệnh dưới dạng chuỗi / danh sách được phân tách

Off đỉnh đầu của tôi. Google cho bash các biến đặc biệt.


124
"Tôi đã làm. Họ đã gửi tôi ở đây." - Skit Bookshop (tài liệu chính thức: gnu.org/software/bash/manual/bashref.html#ecial-Parameter )
greggo

1
Tôi nghĩ $@là chuỗi và $*là danh sách phân định (theo câu trả lời được chấp nhận ở trên, dù sao).
RastaJedi

1
@RastaJedi: "$@"mở rộng thành một danh sách, "$*"mở rộng thành một chuỗi. Hành vi đặc biệt $@áp dụng khi nó nằm trong dấu ngoặc kép.
Keith Thompson

6
Bị từ chối vì đây không phải là một câu trả lời rất đầy đủ hoặc hữu ích. Nói "Google nó" cho thấy sự thiếu nỗ lực, đặc biệt là xem xét rằng phần lớn mọi người kết thúc ở đây từ tìm kiếm của Google. Tôi nghĩ rằng ít nhất bạn có thể làm là thêm liên kết đến tài liệu chính thức. TBH, lý do duy nhất tôi không gắn cờ để xóa là vì ít nhất đó là một câu trả lời một phần cho câu hỏi. Tôi biết nó đã cũ, nhưng vui lòng xem xét chỉnh sửa nó để cung cấp thêm chi tiết.
Sean the Bean

15

Để giúp hiểu những gì làm $#, $0$1, ..., $nlàm, tôi sử dụng tập lệnh này:

#!/bin/bash

for ((i=0; i<=$#; i++)); do
  echo "parameter $i --> ${!i}"
done

Chạy nó trả về một đầu ra đại diện:

$ ./myparams.sh "hello" "how are you" "i am fine"
parameter 0 --> myparams.sh
parameter 1 --> hello
parameter 2 --> how are you
parameter 3 --> i am fine

4
Ý tôi là gì trong vòng lặp for của bạn? Đó thực sự là lý do tại sao tôi ở đây và tôi không thể tìm thấy câu trả lời ở bất cứ đâu vì tôi không biết nên gọi nó là gì.
Anthony

7
@Anthony điều này được gọi là biến đổi . Bạn có thể tìm thấy một giải thích tốt về việc sử dụng của mình trong bash: mở rộng gián tiếp, xin vui lòng giải thích? .
fedorqui 'SO ngừng gây hại'

3

Hãy cẩn thận với một số ví dụ; $ 0 có thể bao gồm một số đường dẫn hàng đầu cũng như tên của chương trình. Ví dụ: lưu tập lệnh hai dòng này dưới dạng ./mytry.sh và thực thi nó.

#!/bin/bash

echo "parameter 0 --> $0" ; exit 0

Đầu ra:

parameter 0 --> ./mytry.sh

Đây là phiên bản hiện tại (năm 2016) của Bash, thông qua Slackware 14.2


5
$ 0 có bao gồm đường dẫn hay không phụ thuộc vào cách bạn chạy tập lệnh ở vị trí đầu tiên. Nếu bạn thực hiện "./mytry.sh" đó là những gì bạn sẽ thấy trong $ 0. Nếu bạn đã nhập "~ / mytry.sh", bạn sẽ thấy đường dẫn đầy đủ (vì trình bao sẽ được mở rộng ~). Nếu bạn đã làm ". Mytry.sh" bạn sẽ thấy 'bash'.
Steve Folly
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.