Về cơ bản, đó là đối số cuối cùng của lệnh trước đó.
!$
là "kết thúc" của lệnh trước đó. Xem xét ví dụ sau: Chúng tôi bắt đầu bằng cách tìm kiếm một từ trong tệp:
grep -i joe /some/long/directory/structure/user-lists/list-15
nếu joe nằm trong danh sách người dùng đó, chúng tôi muốn xóa anh ta khỏi nó. Chúng ta có thể kích hoạt vi với cây thư mục dài đó làm đối số hoặc đơn giản là vi !$
bash nào mở rộng thành:
vi /some/long/directory/structure/user-lists/list-15
( nguồn ; hướng dẫn tiện dụng, nhân tiện)
Không có gì đáng phân biệt giữa !$
mã thông báo này và biến shell đặc biệt $_
. Thật vậy, cả hai mở rộng đến đối số cuối cùng của lệnh trước đó. Tuy nhiên, !$
được mở rộng trong quá trình mở rộng lịch sử , trong khi $_
được mở rộng trong quá trình mở rộng tham số . Một hậu quả quan trọng của việc này là, khi bạn sử dụng !$
, lệnh mở rộng sẽ được lưu trong lịch sử của bạn.
Ví dụ, hãy xem xét các tổ hợp phím
(Các ký tự duy nhất được thay đổi là $!
và $_
ở giữa.)
Trước đây, khi bạn nhấn Up, dòng lệnh sẽ đọc echo Foo Jar
, vì vậy dòng cuối cùng được ghi vào thiết bị xuất chuẩn là Foo Jar
.
Ở phần sau, khi bạn nhấn Up, dòng lệnh sẽ đọc echo $_ bar
, nhưng bây giờ $_
có một giá trị khác so với trước đây, thực sự $_
là bây giờ Jar
, vì vậy dòng cuối cùng được viết cho thiết bị xuất chuẩn là Jar Jar
.
Một hậu quả khác là _
có thể được sử dụng trong các mở rộng tham số khác, ví dụ, chuỗi lệnh
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
in isomorphism isosceles
. Nhưng không có ${!$%morphism}
sự mở rộng " " tương tự .
Để biết thêm thông tin về các giai đoạn mở rộng ở Bash, hãy xem EXPANSION
phần của man 1 bash
(đây được gọi là Mở rộng Shell trong phiên bản trực tuyến). Phần HISTORY EXPANSION
này là riêng biệt.
echo
một cái gì đó nếu bạn không chắc chắn nó sẽ làm gì.