Tại sao $ {$ #} trả về kết quả giống như $$ trong shell?


18

Trong khi cố gắng để có được tham số vị trí cuối cùng được đặt /bin/dash, tôi đã thử echo ${$#}. Đáng ngạc nhiên là điều này không gây ra lỗi, nhưng vào PID giống như $$nội dung biến. Câu hỏi, tại sao cú pháp đó làm việc? Quy tắc cú pháp mà shell áp dụng ở đây là gì?

Về cơ bản, những gì tôi đã làm là

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

Rõ ràng, %nhân vật cũng bị bỏ qua trong cấu trúc như vậy

$ echo ${$%}
13819

Nhưng *@dẫn đến lỗi thay thế xấu:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution

3
Bạn đang mong đợi điều gì ${$*}${$@}sản xuất?
Kusalananda

2
@Kusalananda Không mong đợi. Tôi đã thử các nhân vật khác bên cạnh #%kết quả hành vi từ những người đó.
Sergiy Kolodyazhnyy

1
Để thực sự làm gián tiếp trong Dash, sử dụng eval, ví dụ dash -c 'set 1 2 3 4 5; eval "echo \$$#"'. Nguồn: Ubuntu Wiki
wjandrea

1
@wjandrea Yep, đã biết về điều đó. Thực sự đã có một câu hỏi về nó: stackoverflow.com/questions/1853946/ Nhật Tôi đã cố gắng tự mình tìm một phương pháp mà không cần đọc câu hỏi trước (và tôi đã biết for i; do true; doneđể có được mục cuối cùng $i) nhưng đang tìm kiếm một thứ gì đó thanh lịch hơn. evaltất nhiên có thể có những vấn đề tiềm ẩn, được nghĩ đến mức độ nào - đó là một chủ đề khác. Nhưng vâng, đó là một lựa chọn
Sergiy Kolodyazhnyy

Câu trả lời:


35

Đây là $$ với một tiền tố trống được loại bỏ :

${parameter#[word]}

Xóa mẫu tiền tố nhỏ nhất . Các từ sẽ được mở rộng để tạo ra một mô hình. Việc mở rộng tham số sau đó sẽ dẫn đến tham số , với phần nhỏ nhất của tiền tố khớp với mẫu đã bị xóa. Nếu có, từ sẽ không bắt đầu bằng một trích dẫn #.

Áp dụng tương tự cho %(hậu tố). @*không phải là sửa đổi mở rộng tham số, vì vậy chúng là lỗi. Nó sẽ xảy ra cho $?, $-hay một giả thuyết $=là tốt. ${$+}là một bản mở rộng trống rỗng.


Tôi nên nhận ra sự thay thế tham số ngay lập tức ở đó. Nắm bắt tốt.
Sergiy Kolodyazhnyy
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.