Zasadniczo jest to ostatni argument do poprzedniego polecenia.
!$jest „końcem” poprzedniego polecenia. Rozważ następujący przykład: Zaczynamy od szukania słowa w pliku:
grep -i joe /some/long/directory/structure/user-lists/list-15
jeśli Joe jest na tej liście użytkowników, chcemy go z niego usunąć. Możemy wystrzelić vi z tym długim drzewem katalogów jako argumentem lub tak prosto, jak vi !$Rozwijanie bash do:
vi /some/long/directory/structure/user-lists/list-15
( Źródło ; poręczny przewodnik, przy okazji)
Nie warto nic odróżniać od tego !$tokena od specjalnej zmiennej powłoki $_. Rzeczywiście, oba rozwijają się do ostatniego argumentu poprzedniego polecenia. Jednak !$jest rozszerzany podczas rozszerzania historii , natomiast $_jest rozszerzany podczas rozszerzania parametrów . Jedną z ważnych konsekwencji tego jest to, że kiedy używasz !$, rozszerzone polecenie jest zapisywane w twojej historii.
Weźmy na przykład naciśnięcia klawiszy
(Jedyne zmienione znaki to $!i $_na środku.)
W pierwszym przypadku, gdy naciśniesz Up, wiersz poleceń czyta echo Foo Jar, więc ostatni wiersz zapisany na stdout to Foo Jar.
W drugim przypadku, gdy naciśniesz Up, linia poleceń czyta echo $_ bar, ale teraz $_ma inną wartość niż poprzednio - rzeczywiście $_jest teraz Jar, więc ostatni wiersz zapisany na stdout to Jar Jar.
Inną konsekwencją jest to, że _można go użyć w innych rozszerzeniach parametrów, na przykład w sekwencji poleceń
printf '%s ' isomorphism
printf '%s\n' ${_%morphism}sceles
odbitki isomorphism isosceles. Ale nie ma analogicznego ${!$%morphism}rozszerzenia.
Aby uzyskać więcej informacji na temat faz ekspansji w Bash, zobacz EXPANSIONsekcję man 1 bash(nazywa się to Shell Expansions w wydaniu online). HISTORY EXPANSIONSekcji jest oddzielona.
echoczegoś, jeśli nie jesteś pewien, co to zrobi.