Что такое подстановка переменных в программировании оболочки

Похоже, вы используете gnu sed — в этом случае вы можете сделать что-то вроде

sed -s 'N;/PATTERN/!P;D' ./*.txt

С другими sed вам придется просмотреть список файлов в цикле.

for file in ./*.txt
do
sed '$!N;/PATTERN/!P;D' "$file"
done

Это всегда будет держать две строки в пространстве шаблонов и печатать первую, если пространство шаблонов не совпадает, поэтому при вводе, подобном

some line
PATTERN
PATTERN
more
lines
another line
PATTERN

, он будет печатать

more
lines
0
13.09.2019, 04:09
1 ответ

замена значения одной переменной другой.

Это описание неверно по нескольким пунктам. Замена переменной заменяет имя переменной (плюс немного синтаксической ерунды) на ее значение. Кроме того, он работает не «в» переменной, а в команде. Это может быть команда, которая устанавливает значение переменной, но это только один случай из многих.

Например, команда echo $foo отображает значение переменной. Исходный код содержит $foo, а соответствующий вывод содержит значение переменной foo.

Причина, по которой это называется «подстановкой переменных», заключается в том, что оболочка работает с последовательностью преобразований строк (и списков строк). Например (упрощенно), рассмотрим команду ls -l $dir/*.$ext. Чтобы оценить это, последовательно происходит несколько вещей:

  1. Оболочка начинает анализировать команду и разбивает ее на три слова: ls, -l и $dir/ *.$ext.
  2. В третьем слове оболочка видит две подстановки переменных для выполнения (именно это означает знак доллара в данном контексте). Предположим, что значение dir равно /some/path, а значение ext равно txt, тогда оболочка перезаписывает $dir/*.$ext в /some/path/*.txt. Это подстановка, потому что значение каждой переменной заменяется синтаксисом имени доллара.
  3. Оболочка расширяет шаблон подстановочных знаков /some/path/*.txt в список совпадающих имен файлов.
  4. Оболочка выполняет ls с вычисленными аргументами.

(Синтаксис $foo не просто заменяет значение переменной, но это уже другая история.)

В большинстве языков программирования для получения значения переменной достаточно напишите имя переменной. Оболочка предназначена для интерактивного использования; если вы пишете имя, оно интерпретируется как буквальная строка. Вот почему в синтаксисе для получения значения переменной есть дополнительный маркер, говорящий: «Я хочу получить значение переменной».

почему это действие требует специального термина вместо того, чтобы просто сказать «изменение значения переменной с редактированием его вручную в текстовом редакторе»?

Подстановка переменной не имеет ничего общего с изменением значения переменной. Изменение значения переменной является присваиванием.

Конечно, присваивание может содержать подстановки переменных, как и любая другая команда. Но подстановки переменных не предназначены специально для присваиваний.

Кроме того, вы не можете изменить значение переменная с помощью редактора. Уже объявленная переменная имеет значение в каждом процессе, это не конфигурация системы. У вас могут быть файлы конфигурации, которые устанавливают начальное значение переменной, и вы можете использовать редактор чтобы изменить это начальное значение в этих файлах, но после этого значение может измениться.

6
28.01.2020, 02:15

Теги

Похожие вопросы