Незважаючи на те, що bashаспект охоплений, ваше питання змушує мене думати, що ви натрапили на ці змінні в perlкоді.
$&і $_є спеціальними змінними в perl. І вони особливо зустрічаються в perlкоді, названому з коду оболонки.
$_є змінною за замовчуванням, на якій працюють багато perlфункцій і операторів. Ця змінна також є змінною за замовчуванням, встановленою операторами введення.
В:
perl -pe 'some-code' < some-input
Деякий код виконується для кожного рядка деякого вводу, при цьому рядок зберігається в $_ , а вміст цього $_друкується після запуску деякого коду.
s/regex/replacement/Оператор працює по $_замовчуванням. Тому ви часто знаходите такі речі, як:
perl -pe 's/foo/bar/'
Що коротко для:
perl -pe '$_ =~ s/foo/bar/'
(вище, $_що стосується оболонки - це лише частина дослівного аргументу, переданого perlінтерпретатору, він не є змінною оболонки. Цей дослівний аргумент передається як perlвираз ( -e) доperl , і саме perlтому він інтерпретується як змінна).
$&- це ще одна спеціальна perlзмінна, яка розширюється до того, що відповідає останньому оператору відповідності (m/.../ , s/.../.../...).
Наприклад:
$ echo foo | perl -lne '
print "The last character in $_ is $&" if m/.$/'
The last character in foo is o
Або:
$ echo foo bar | perl -pe 's/[aeiou]+/<$&>/g'
f<oo> b<a>r