$ * Và $ # trong Linux là gì?


82

Các biến môi trường sau đây trong Linux có nghĩa là gì?

  1. $ * (Ký hiệu đô la theo dấu hoa thị) là gì?
  2. $ # (Ký hiệu đô la bên cạnh dấu băm / ký hiệu số / octothorpe / ký hiệu bảng Anh) là gì?

Câu trả lời:


115

Từ đây :

$#    Stores the number of command-line arguments that 
      were passed to the shell program.
$?    Stores the exit value of the last command that was 
      executed.
$0    Stores the first word of the entered command (the 
      name of the shell program).
$*    Stores all the arguments that were entered on the
      command line ($1 $2 ...).
"$@"  Stores all the arguments that were entered
      on the command line, individually quoted ("$1" "$2" ...).

Về cơ bản, $#là một số đối số được đưa ra khi tập lệnh của bạn được thực thi. $*là một chuỗi chứa tất cả các đối số. Ví dụ, $1là đối số đầu tiên và như vậy. Điều này rất hữu ích, nếu bạn muốn truy cập một đối số cụ thể trong tập lệnh của mình.

Như Brian nhận xét, đây là một ví dụ đơn giản. Nếu bạn chạy lệnh sau:

./command -yes -no /home/username
  • $# = 3
  • $* = = -yes -no /home/username
  • $@ = mảng: {"-yes", "-no", "/home/username"}
  • $0= ./command, $1= -yesv.v.

Đây là một phần của tiêu chuẩn POSIX và phải được hỗ trợ bởi tất cả các trình bao tuân thủ. Để tham khảo, bên dưới là định nghĩa tiêu chuẩn POSIX cho từng tham số đặc biệt. Do lưu ý có ba biến thêm: $-, $$$!.

$@:

Mở rộng đến các tham số vị trí, bắt đầu từ một. Khi mở rộng xảy ra trong dấu ngoặc kép và khi thực hiện tách trường (xem Phân tách trường ), mỗi tham số vị trí sẽ mở rộng thành một trường riêng biệt, với điều kiện là việc mở rộng tham số đầu tiên vẫn được nối với phần đầu của từ gốc (giả sử rằng tham số mở rộng được nhúng trong một từ) và việc mở rộng tham số cuối cùng sẽ vẫn được nối với phần cuối của từ gốc. Nếu không có tham số vị trí, việc mở rộng '@' sẽ tạo ra các trường bằng 0, ngay cả khi '@' được trích dẫn kép.

$*:

Mở rộng đến các tham số vị trí, bắt đầu từ một. Khi mở rộng xảy ra trong một chuỗi trích dẫn kép (xem Dấu ngoặc kép ), nó sẽ mở rộng thành một trường duy nhất với giá trị của từng tham số được phân tách bằng ký tự đầu tiên của biến IFS hoặc nếu IFS không được đặt. Nếu IFS được đặt thành một chuỗi null, điều này không tương đương với việc bỏ đặt chuỗi đó; ký tự đầu tiên của nó không tồn tại, vì vậy các giá trị tham số được nối với nhau.

$#:

Mở rộng đến số thập phân của các tham số vị trí. Tên lệnh (tham số 0) sẽ không được tính vào số được cho bởi '#' vì đây là tham số đặc biệt, không phải là tham số vị trí.

$?:

Mở rộng đến trạng thái thoát thập phân của đường ống gần đây nhất (xem Đường ống ).

$-:

(Dấu gạch nối.) Mở rộng sang các cờ tùy chọn hiện tại (tên tùy chọn một chữ cái được nối thành một chuỗi) như được chỉ định trong lệnh gọi, bằng cách đặt lệnh tích hợp đặc biệt hoặc ẩn bởi trình bao.

$$:

Mở rộng đến ID tiến trình thập phân của shell được gọi. Trong một lớp con (xem Môi trường thực thi Shell ), '$' sẽ mở rộng thành cùng giá trị với lớp vỏ hiện tại.

$!:

Mở rộng tới ID tiến trình thập phân của lệnh nền gần đây nhất (xem Danh sách ) được thực thi từ trình bao hiện tại. (Ví dụ: các lệnh nền được thực thi từ các lớp con không ảnh hưởng đến giá trị của "$!" Trong môi trường shell hiện tại.) Đối với một đường ống, ID tiến trình là lệnh cuối cùng trong đường ống.

$0:

(Không.) Mở rộng thành tên của tập lệnh shell hoặc shell. Xem sh để biết mô tả chi tiết về cách tên này được bắt nguồn.


1
Những tham số đặc biệt này là đúng trong tất cả các shell có nguồn gốc từ Bourne (ví dụ sh, bash, dash, ash, ksh, zsh).
Dennis Williamson

Sửa: $*$#là 1) biến shell, không phải biến môi trường; 2) được chuẩn hóa (một phần của thông số POSIX.)
grawity

3
Cũng lưu ý rằng "$@"nhiều lần được viết là ${1+"$@"}(vì lý do tính di động), xem stackoverflow.com/questions/743454/ Đá để được giải thích.
hlovdal

Vì 'Tên lệnh (tham số 0) sẽ không được tính ...', trong ví dụ trên phải là $ # = 2, bắt đầu đếm từ 0.
Josef Klimuk

0

$# đại diện cho số lượng đối số:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3

2
Chào mừng đến với Siêu người dùng. Trang web là một cơ sở kiến ​​thức, vì vậy mục đích là mỗi câu trả lời cung cấp một giải pháp cho câu hỏi chưa được đóng góp. Điều này chỉ giải quyết một nửa câu hỏi và thông tin đã được trình bày rõ trong câu trả lời trước.
fixer1234
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.