Использование sed
Потоковый текстовый редактор «sed» встроен в bash Linux Ubuntu. Он использует построчное чтение, а также позволяет выполнить фильтрацию и преобразование текста.
Синтаксис
Для работы с потоковым текстовым редактором sed используется следующий синтаксис:
sed instructions (где options— ключи-опции для указания метода обработки текста, instructions— команда, совершаемая над найденным фрагментом текста, file_name— имя файла, над которым совершаются действия).
Для вывода всех опций потокового текстового редактора нужно воспользоваться командой:
sed --help
Замена слова
Например, если требуется заменить строку в файле или слово с «команды» на «инструкции». Для этого нужно воспользоваться следующими конструкциями:
- Для первого вхождения:
sed 's/команды/инструкции/' firstfile.txt
- Для всех вхождений (используется параметр инструкции — g):
sed 's/команды/инструкции/g' firstfile.txt
- Замена подстроки с несколькими условиями (используется ключ — -e):
sed -e 's/команды/инструкции/g' -e 's/команд/инструкций/g' firstfile.txt
- Заменить часть строки, если она содержит определенный набор символов (например, POSIX):
sed '/POSIX/s/Bash/оболочка/g' firstfile.txt
- Выполнить замену во всех строках, начинающихся на Bash
sed '/^Bash/s/Bash/оболочка/g' firstfile.txt
- Произвести замену только в строках, которые заканчиваются на Bash:
sed '/команды/s/Bash/оболочка/g' firstfile.txt
- Заменить слово с пробелом на слово с тире:
sed 's/Bash\ /оболочка-/g' firstfile.txt
- Заменить символ переноса строки на пробел
sed 's/\n/ /g' firstfile.txt
- Перенос строки обозначается символом — \n.
Редактирование файла
Чтобы записать строку в файл, нужно указать параметр замены одной строки на другую, воспользовавшись ключом — -i:
sed -i 's/команды/инструкции/' firstfile.txt
После выполнения команды произойдет замена слова командынаинструкциис последующим сохранением файла.
Удаление строк из файла
- Удалить первую строку из файла:
sed -i '1d' firstfile.txt
- Удалить строку из файла, содержащую слово окне»:
sed '/окне/d' firstfile.txt
После выполнения команды будет удалена первая строка, поскольку она содержит указанное слово.
- Удалить пустые строки:
sed '/^$/d' firstfile.txt
- Убрать пробелы в конце строки:
sed 's/ *$//' firstfile.txt
-
Табуляция удаляется при помощи конструкции:
sed 's/\t*$//' firstfile.txt
- Удалить последний символ в строке:
sed 's/ ;$//' firstfile.txt
Нумерация строк
Строки в файле будут пронумерованы следующим образом: первая строка — 1, вторая — 2 и т. д.
Следует обратить внимание, что нумерация начинается не с «0», как в языках программирования
sed = firstfile.txt | sed 'N;s/\n/\t/'
Замена символов
Чтобы заменить набор символов, нужно воспользоваться инструкцией, содержащей команду «y»:
sed 'y/1978/1977/g' firstfile.txt
Обработка указанной строки
Утилита производит манипуляции не только с текстом, но и со строкой, указанной в правиле шаблона (3 строка):
sed '3s/директорий/папок' firstfile.txt
Работа с диапазоном строк
Для выполнения замены только в 3 и 4 строках нужно использовать конструкцию:
sed '3,4s/директорий/папок' firstfile.txt
Вставка содержимого файла после строки
Иногда требуется вставить содержимое одного файла (input_file.txt) после определенной строки другого (firstfile.txt). Для этой цели используется команда:sed ‘5r input_file.txt’ firstfile.txt (где 5r— 5 строка, input_file.txt— исходный файл и firstfile.txt— файл, в который требуется вставить массив текста).
Как экспортировать переменные
Когда скрипт выполняется, он находится в своем собственном процессе, и используемые им переменные не видны вне этого процесса. Если вы хотите поделиться переменной с другим скриптом, который запускает ваш скрипт, вы должны экспортировать эту переменную. Мы покажем вам, как это сделать с помощью двух сценариев.
Сначала сохраните следующее с именем :
#! / Bin / Баш first_var = альфа second_var = браво # проверить их значения echo "$ 0: first_var = $ first_var, second_var = $ second_var" экспортировать first_var экспорт second_var ./script_two.sh # проверьте их значения еще раз echo "$ 0: first_var = $ first_var, second_var = $ second_var"
Это создает две переменные, и , и назначает некоторые значения. Он выводит их в окно терминала, экспортирует переменные и вызывает . Когда завершается, и поток процесса возвращается к этому сценарию, он снова печатает переменные в окне терминала. Затем вы можете увидеть, изменились ли они.
Второй скрипт, который мы будем использовать, это . Это скрипт, который вызывает . Введите следующее:
#! / Bin / Баш # проверить их значения echo "$ 0: first_var = $ first_var, second_var = $ second_var" # установить новые значения first_var = чарли second_var = дельта # проверьте их значения еще раз echo "$ 0: first_var = $ first_var, second_var = $ second_var"
Этот второй сценарий печатает значения двух переменных, присваивает им новые значения, а затем печатает их снова.
Чтобы запустить эти сценарии, вы должны ввести следующее, чтобы сделать их исполняемыми:
chmod + x script_one.sh chmod + x script_two.sh
А теперь введите следующее для запуска :
./script_one.sh
Вот что говорит нам результат:
- script_one.sh печатает значения переменных, которые являются альфа и браво.
- script_two.sh печатает значения переменных (альфа и браво) по мере их получения.
- script_two.sh меняет их на Чарли и Дельта.
- script_one.sh печатает значения переменных, которые по-прежнему являются альфа и браво.
То, что происходит во втором сценарии, остается во втором сценарии. Это похоже на то, что копии переменных отправляются во второй скрипт, но они отбрасываются при выходе из этого скрипта. Исходные переменные в первом скрипте не изменяются ничем, что происходит с их копиями во втором.
Потоки
Файл, из которого осуществляется чтение, называется стандартным потоком ввода, а в который осуществляется запись — стандартным потоком вывода.
Стандартные потоки:
При перенаправлении потоков, вы можете указывать ссылки на определенные потоки. Например, перенаправим вывод и ошибки команды в файл:
Перенаправление потоков
Для перенаправления потоков используются основные команды: <, >, >>, <<<, |. Рассмотрим как можно перенаправлять стандартные потоки.
Перенаправление потока вывода:
Перенаправление потока ввода (прием данных):
Перенаправление вывода ошибок:
Примечание
Если вам нужно захватить вывод команды в переменную и при этом отобразить вывод на экране, используйте :
Подстановка процессов
Передать процессу команда1 файл (созданный налету канал или файл /dev/fd/…), в котором находятся данные, которые выводит команда2:
Примеры
Логировать результат поиска и ошибки:
Эта конструкция позволяет читать из строки как из файла. Демонстрационный пример:
Создаем временный файл и записываем в него поток переданный скрипту:
А теперь откроем файл в текстовом редакторе с «отвязкой» (отключением) от терминала, подавляем вывод сообщений в терминал:
Примеры использования массивов Bash
Теперь рассмотрим примеры массивов bash. Сначала нам нужно создать массив, который мы будем использовать для примеров, на мой взгляд будет проще использовать синтаксис с круглыми скобками. Вообще, массивы используются в скриптах, но мы будем их применять прямо в оболочке Bash. Для начала так будет проще. Создаем массив:
Теперь попытаемся вывести один из элементов массива по его индексу:
Чаще всего используются массивы строк Bash, но иногда могут встречаться и цифры. Помните про нумерацию? Индексы элементов массива начинаются с нуля. Для вывода значения элемента по индексу можно использовать и немного другой синтаксис:
Вы можете вывести все элементы:
Все элементы, начиная с номера 1:
Вывести все элементы которые находятся в диапазоне от 1 до 4:
Чтобы узнать длину первого элемента выполните:
А посмотреть количество элементов массива Bash можно таким же синтаксисом:
Кроме всего прочего, вы можете заменить одни символы в определенном элементе массива или во всем массиве на другие. Для этого используйте:
В некоторых случаях, для перебора элементов массива очень удобно использовать циклы. На этот раз сделаем небольшой скрипт:
#!/bin/bash
array=(первый второй третий четвертый пятый)
for i in ${array}
do
echo $i
done
Внутри цикла вы можете делать со значением элемента все, что вам нужно. Как я уже писал выше, вы можете прочитать значения для массива с помощью функции read:
#!/bin/bash
echo «Введите элементы массива:»
read -a array
echo «Результат:»
for i in ${array}
do
echo $i
done
Как и в любом другом варианте, вам нужно, чтобы все элементы были разделены пробелом. Точно так же можно присвоить массиву результат выполнения команды. Например, сохраним список файлов, полученный от ls:
Усложним задачу и сделаем скрипт, который будет выводить все файлы из указанной директории, которые имеют права доступа 755:
#!/bin/bash
ERR=27
EXT=0
if ; then
echo «Используйте: $0 <путь>»
exit $ERR
fi
if ; then
echo «Каталог $1 не существует»
exit $ERR
fi
temp=( $(find $1 -maxdepth 1 -type f) )
for i in «${temp}»
do
perm=$(ls -l $i)
if ; then
echo ${i##*/}
fi
done
exit $EXT
Теперь проверим наш скрипт на папке /bin. Но перед этим нужно дать ему права на выполнение:
Как видите, все работает. Кроме номеров, в качестве индексов для массивов можно использовать строки. Такие массивы Bash называются ассоциативными и поддерживаются они начиная с четвертной версии Bash. Для создания ассоциативного массива используется declare с опцией -A:
Несмотря на то что Bash поддерживает только одномерные массивы, мы можем выполнять симуляцию работы с многомерными матрицами с помощью ассоциативных массивов:
Чтобы удалить массив, созданный с помощью declare используйте функцию unset:
7 ответов
Лучший ответ
Обновление — начиная с версии 1.3 (июнь 2016 г.) в Visual Studio Code можно выполнять поиск и замену. Используя ctrl + shift + f, вы можете искать и заменять текст во всех файлах.
Кажется, в настоящий момент это невозможно (версия 1.1.1 (апрель 2016 г.))
«В: Возможен ли глобальный поиск и замена?
О: Эта функция еще не реализована, но вы можете ожидать, что она появится в будущем! «
Похоже, это также требуется сообществом: https://github.com/Microsoft/vscode/issues/1690
30
mikemaccana
13 Ноя 2020 в 15:12
Я использую Visual Studio Code 1.8, и эта функция доступна. Но сначала это немного сложно понять, и (на момент написания) четко не объясняется, как его использовать, поэтому вот как это работает, шаг за шагом:
Вызов Заменить в файлах (в меню Правка или с помощью сочетания клавиш Ctrl + Shift + H )
Вы увидите стандартный ввод Find / Replace, заменяющий панель файлов слева:
Введите строку поиска и строку замены, затем нажмите клавишу ВВОД
Он может на секунду выполнить поиск всех файлов, а затем отобразит предлагаемые изменения во всех файлах вашего проекта, но обратите внимание, эти изменения еще не были внесены! Вот как это выглядит:
Теперь вам нужно внести изменения (и даже после этого вам нужно сохранить измененные файлы .)
Вы можете внести эти изменения разными способами:
1) Сделайте все изменения сразу во всех файлах.
Щелкните значок замены рядом со строкой замены (примечание: вы получите диалоговое окно для подтверждения этого массового действия.)
2) Сделайте все изменения сразу в одном файле.
Щелкните значок замены рядом с именем файла (примечание: значок появляется только при наведении курсора на строку имени файла)
3) Сделайте одно изменение в одном файле.
Щелкните значок замены рядом с отдельным изменением: (примечание: значок отображается только при наведении курсора на строку изменений)
Наконец, не забудьте сохранить!
Все эти файлы теперь изменены в редакторе и еще не сохранены на диск.
Используйте Файл -> Сохранить все (или Ctrl + Alt + S )
Обновление: я не уверен, когда это было добавлено, но если вы нажмете кнопку «Заменить все» и увидите это диалоговое окно, нажатие «Заменить» изменит и сохранит все файлы одним щелчком:
413
Jeff Ward
11 Дек 2019 в 18:47
Чтобы заменить строку в одном файле (открытом в данный момент): CTRL + H
Для замены на уровне рабочей области используйте: CTRL + SHIFT + H
31
ZF007
10 Июл 2019 в 10:32
Это лучший способ .
-
Сначала наведите курсор на элемент и нажмите F2.
-
Затем введите новое имя и нажмите клавишу Enter. Это переименует все вхождения в каждом файле вашего проекта.
Это идеальный вариант, если вы хотите переименовать несколько файлов. Например, вы можете захотеть переименовать общедоступную функцию в сервисе Angular и обновить везде, где она используется.
Чтобы получить больше отличных инструментов, я настоятельно рекомендую: https://johnpapa.net/refactoring-with-visual-studio-code/ а>
23
DonDaniel
31 Янв 2018 в 16:03
На странице Привязки клавиш кода Visual Studio раздел содержит ссылки на PDF-файлы для каждой основной ОС. После открытия найдите «заменить в файлах» или любой другой ярлык, который может вам понадобиться.
Другой способ — использовать палитру команд ( ctrl / cmd + shift + P ), где вы можете ввести » replace «, чтобы перечислить все связанные команды, включая ту, которую вы хотите:
8
Magnus Lind Oxlund
15 Май 2019 в 22:34
Существует два технически одинаковых метода
-
Сначала наведите курсор на слово и нажмите F2. Замените свое слово и нажмите Enter.
-
Сначала наведите курсор на слово и щелкните его левой кнопкой мыши. Щелкните опцию «Переименовать символ». Замените свое слово и нажмите Enter.
Shuaib Abubakker Bapputty Haji
30 Авг 2020 в 06:32
Обновление на 2020 год
Если вы используете функцию поиска для поиска по файлам (), может быть легко упустить возможность преобразования вашего поиска в поиск и замену в пользовательском интерфейсе.
Вот типичный результат поиска:
Чтобы преобразовать это в поиск и заменить, вам нужно щелкнуть значок стрелки слева от поля ввода поиска. Это откроет параметры замены, как показано ниже
Обратите внимание, что значок стрелки теперь направлен вниз
Сочетание клавиш также будет работать для доступа к поиску и замене.
Ссылка на документы VSCode по поиску и замене: .
2
jhovanec
8 Окт 2020 в 14:36
Вставка текста в поток
С помощью sed можно вставлять данные в текстовый поток, используя команды
i и
a:
- Команда
i добавляет новую строку перед заданной. - Команда
a добавляет новую строку после заданной.
Рассмотрим пример использования команды
i:
$ echo «Another test» | sed ‘i\First test ‘
1 | $echo»Another test»|sed’i\First test ‘ |
Команда i
Теперь взглянем на команду
a:
$ echo «Another test» | sed ‘a\First test ‘
1 | $echo»Another test»|sed’a\First test ‘ |
Команда a
Как видно, эти команды добавляют текст до или после данных из потока. Что если надо добавить строку где-нибудь посередине?
Тут нам поможет указание номера опорной строки в потоке, или шаблона. Учтите, что адресация строк в виде диапазона тут не подойдёт. Вызовем команду
i, указав номер строки, перед которой надо вставить новую строку:
$ sed ‘2i\This is the inserted line.’ myfile
1 | $sed’2i\This is the inserted line.’myfile |
Команда i с указанием номера опорной строки
Проделаем то же самое с командой
a:
$ sed ‘2a\This is the appended line.’ myfile
1 | $sed’2a\This is the appended line.’myfile |
Команда a с указанием номера опорной строки
Обратите внимание на разницу в работе команд
i и
a. Первая вставляет новую строку до указанной, вторая — после
Как они работают?
Переменная является временным хранилищем для части информации. Для переменных можно выполнить два действия:
- Установка значения для переменной.
- Чтение значения переменной.
Переменные могут иметь значение, определенное несколькими различными способами. Наиболее распространенными являются установка значения непосредственно и его значение, которое должно быть установлено в результате обработки командой или программой. Вы увидите примеры обоих ниже.
Чтобы прочитать переменную, мы помещаем ее имя (которому предшествует знак $) в любом месте сценария, который нам нужен. Прежде чем Bash интерпретирует (или запускает) каждую строку нашего скрипта, он сначала проверяет, имеются ли какие-либо имена переменных. Для каждой переменной, которую она идентифицировала, она заменяет имя переменной своим значением. Затем он запускает эту строку кода и снова запускает процесс на следующей строке.
Вот несколько быстрых точек синтаксиса. Они будут подробно рассмотрены и продемонстрированы ниже.
- При указании или чтении переменной мы помещаем знак $ перед именем переменной.
- При установке переменной мы оставляем знак $.
- Некоторым людям нравится писать имена переменных в верхнем регистре, чтобы они выделялись. Это ваше предпочтение. Они могут быть все прописными буквами, все строчными буквами или смесью.
- Переменная может быть размещена в любом месте сценария (или в командной строке, если на то пошло), а при запуске Bash заменит его значением переменной. Это стало возможным, поскольку замена выполняется до запуска команды.
Выполнение наборов команд при вызове sed
Для выполнения нескольких действий с данными, используйте ключ
-e при вызове sed. Например, вот как организовать замену двух фрагментов текста:
$ sed -e ‘s/This/That/; s/test/another test/’ ./myfile
1 | $sed-e’s/This/That/; s/test/another test/’.myfile |
Использование ключа -e при вызове sed
К каждой строке текста из файла применяются обе команды. Их нужно разделить точкой с запятой, при этом между окончанием команды и точкой с запятой не должно быть пробела.Для ввода нескольких шаблонов обработки текста при вызове sed, можно, после ввода первой одиночной кавычки, нажать Enter, после чего вводить каждое правило с новой строки, не забыв о закрывающей кавычке:
$ sed -e ‘
> s/This/That/
> s/test/another test/’ ./myfile
1 |
$sed-e’ > s/This/That/ > s/test/another test/’.myfile |
Вот что получится после того, как команда, представленная в таком виде, будет выполнена.
Другой способ работы с sed
Основы работы с sed
Утилиту sed называют потоковым текстовым редактором. В интерактивных текстовых редакторах, наподобие nano, с текстами работают, используя клавиатуру, редактируя файлы, добавляя, удаляя или изменяя тексты. Sed позволяет редактировать потоки данных, основываясь на заданных разработчиком наборах правил. Вот как выглядит схема вызова этой команды:
$ sed options file
1 | $sed options file |
По умолчанию sed применяет указанные при вызове правила, выраженные в виде набора команд, к
STDIN. Это позволяет передавать данные непосредственно sed.
Например, так:
$ echo «This is a test» | sed ‘s/test/another test/’
1 | $echo»This is a test»|sed’s/test/another test/’ |
Вот что получится при выполнении этой команды.
Простой пример вызова sed
В данном случае sed заменяет слово «test» в строке, переданной для обработки, словами «another test». Для оформления правила обработки текста, заключённого в кавычки, используются прямые слэши. В нашем случае применена команда вида
spattern1pattern2. Буква «s» — это сокращение слова «substitute», то есть — перед нами команда замены. Sed, выполняя эту команду, просмотрит переданный текст и заменит найденные в нём фрагменты (о том — какие именно, поговорим ниже), соответствующие
pattern1, на
pattern2.
Выше приведён примитивный пример использования sed, нужный для того, чтобы ввести вас в курс дела. На самом деле, sed можно применять в гораздо более сложных сценариях обработки текстов, например — для работы с файлами.
Ниже показан файл, в котором содержится фрагмент текста, и результаты его обработки такой командой:
$ sed ‘s/test/another test’ ./myfile
1 | $sed’s/test/another test’.myfile |
Текстовый файл и результаты его обработки
Здесь применён тот же подход, который мы использовали выше, но теперь sed обрабатывает текст, хранящийся в файле. При этом, если файл достаточно велик, можно заметить, что sed обрабатывает данные порциями и выводит то, что обработано, на экран, не дожидаясь обработки всего файла.
Sed не меняет данные в обрабатываемом файле. Редактор читает файл, обрабатывает прочитанное, и отправляет то, что получилось, в
STDOUT. Для того, чтобы убедиться в том, что исходный файл не изменился, достаточно, после того, как он был передан sed, открыть его. При необходимости вывод sed можно перенаправить в файл, возможно — перезаписать старый файл.
Пример
Представим себе такую задачу. Есть файл, в котором имеется некая последовательность символов, сама по себе бессмысленная, которую надо заменить на данные, взятые из другого файла. А именно, пусть это будет файл
newfile, в котором роль указателя места заполнения играет последовательность символов
DATA. Данные, которые нужно подставить вместо
DATA, хранятся в файле
data.
Решить эту задачу можно, воспользовавшись командами
r и
d потокового редактора sed:
$ Sed ‘/DATA>/ {
r newfile
d}’ myfile
1 |
$Sed’/DATA>/ { r newfile d}’myfile |
Замена указателя места заполнения на реальные данные
Как видите, вместо заполнителя
DATA sed добавил в выходной поток две строки из файла
data.
Расширение области действия переменной
Чтобы сделать внутреннюю переменную видимой для других дочерних процессов, необходим дополнительный шаг. Этот шаг называется экспортом переменной. Bash предлагает использование ключевого слова export, за которым следует имя переменной. В листинге ниже это показано для переменной backupPath.
$ backupPath=”/opt/backup/” $ export backupPath
Команда экспорта – это встроенная оболочка, которая используется для определения переменной как той, которую наследуют подоболочки (оболочки, порожденные из оригинала). Таким образом, экспортируемые переменные могут быть прочитаны и записаны более чем одним процессом.
Второй вариант – объявить переменную как переменную среды с самого начала. Вы можете сделать это, используя ключевое слово declare, за которым следует параметр «-x». Эффект аналогичен введенной ранее команде экспорта.
$ declare -x BACKUPPATH=”/opt/backup/”
Удаление строк
Утилита sed годится не только для замены одних последовательностей символов в строках на другие. С её помощью, а именно, используя команду
d, можно удалять строки из текстового потока.
Вызов команды выглядит так:
$ sed ‘3d’ myfile
1 | $sed’3d’myfile |
Мы хотим, чтобы из текста была удалена третья строка
Обратите внимание на то, что речь не идёт о файле. Файл останется неизменным, удаление отразится лишь на выводе, который сформирует sed
Удаление третьей строки
Если при вызове команды
d не указать номер удаляемой строки, удалены будут все строки потока.
Вот как применить команду
d к диапазону строк:
$ sed ‘2,3d’ myfile
1 | $sed’2,3d’myfile |
Удаление диапазона строк
А вот как удалить строки, начиная с заданной — и до конца файла:
$ sed ‘3,$d’ myfile
1 | $sed’3,$d’myfile |
Удаление строк до конца файла
Строки можно удалять и по шаблону:
$ sed ‘/test/d’ myfile
1 | $sed’/test/d’myfile |
Удаление строк по шаблону
При вызове
d можно указывать пару шаблонов — будут удалены строки, в которых встретится шаблон, и те строки, которые находятся между ними:
$ sed ‘/second/,/fourth/d’ myfile
1 | $sed’/second/,/fourth/d’myfile |
Удаление диапазона строк с использованием шаблонов
Переменная видимость
По умолчанию переменная локально привязана к структуре, функции, сценарию или процессу и не может быть доступна извне. Пример ниже показывает это для переменной $message, принадлежащей сценарию, и $welcome, принадлежащей функции outputWelcomeMessage().
#!/bin/bash # определите сообщение переменной для скрипта message=”Привет, еще раз!” outputWelcomeMessage() { # определение локальной переменной welcome=”Привет!” echo $welcome } outputWelcomeMessage() # напечатать Привет! echo $message # напечатать Привет, еще раз!
Чтобы убедиться, что ранее определенная переменная с тем же именем привязана локально, используйте ключевое слово local, как показано ниже. Без ключевого слова local присвоение в строке 8 относилось бы к глобальной переменной с тем же именем, определенным ранее.
#!/bin/bash # определите сообщение переменной для скрипта message=”Привет, еще раз!” outputWelcomeMessage () { # определение локальной переменной с тем же именем Local message=”Привет!” echo $message } outputWelcomeMessage () # напечатать Привет! echo $message # напечатать Привет, еще раз!
Настройка собственных переменных
Помимо переменных, которые заданы системой, мы можем также установить собственные переменные. Это может быть полезно для отслеживания результатов команд и возможности ссылаться на них и обрабатывать их позже.
Существует несколько способов, которыми могут быть заданы переменные (например, часть выполнения команды), но базовая форма следует этому шаблону:
переменная = значение
Это одна из тех областей, где важно форматирование. Обратите внимание, что по обе стороны от знака равенства (=) нет места. Мы также оставляем знак $ с начала имени переменной при настройке. Имена переменных могут быть прописными или строчными буквами или смесью обоих, но Bash — это среда, чувствительная к регистру, поэтому всякий раз, когда вы ссылаетесь на переменную, вы должны быть последовательны при использовании прописных и строчных букв. Вы всегда должны убедиться, что имена переменных являются описательными. Это облегчает вам задачу
Имена переменных могут быть прописными или строчными буквами или смесью обоих, но Bash — это среда, чувствительная к регистру, поэтому всякий раз, когда вы ссылаетесь на переменную, вы должны быть последовательны при использовании прописных и строчных букв. Вы всегда должны убедиться, что имена переменных являются описательными. Это облегчает вам задачу.
Вот простой пример, иллюстрирующий их использование.
Shell
#!/bin/bash
# Пример простой переменной
myvariable=Hello
anothervar=Fred
echo $myvariable $anothervar
echo
sampledir=/etc
ls $sampledir
1 |
#!/bin/bash myvariable=Hello anothervar=Fred echo$myvariable$anothervar echo sampledir=etc ls$sampledir |
Давайте разберем это:
- Строки 4 и 6 — задайте значение двух переменных myvariable и anothervar.
- Строка 8 — запустить эхо команды, чтобы проверить, что переменные были установлены в соответствии с назначением.
- Строка 9 — запустите команду echo на этот раз без аргументов. Это хороший способ получить пустую строку на экране, чтобы помочь решить проблему.
- Строка 11 — установите другую переменную, на этот раз в качестве пути к определенному каталогу.
- Строка 13 — запустите команду ls, заменив значение переменной sampledir в качестве первого аргумента командной строки.
Важно отметить, что в приведенном выше примере мы использовали команду echo просто потому, что это удобный способ продемонстрировать, что переменные действительно были установлены. эхо не требуется для использования переменных и используется только тогда, когда вы хотите напечатать определенное сообщение на экране. (Практически все команды печатают вывод на экран по умолчанию, поэтому вам не нужно помещать эхо перед ними.)
Переменные могут быть полезны для упрощения управления нашими сценариями. Возможно, наш скрипт будет запускать несколько команд, некоторые из которых будут ссылаться на конкретный каталог. Вместо того, чтобы вводить эту директорию каждый раз, когда мы можем установить ее один раз в переменной, обратитесь к этой переменной. Затем, если требуемый каталог изменится в будущем, нам нужно обновить только одну переменную, а не каждый экземпляр внутри скрипта.
Замена команды
Подстановка команд позволяет нам выводить вывод команды или программы (что обычно печатается на экране) и сохранять ее как значение переменной. Для этого мы помещаем его в скобки, которому предшествует знак $.
Подстановка команд хороша и проста, если вывод команды — это одно слово или строка. Если выход идет по нескольким строкам, то новые строки просто удаляются, и весь вывод заканчивается на одной строке.
Давайте разберем это:
- Строка 1 — Запустим команду ls . Обычно его выход будет состоять из нескольких строк. Я немного сократил его в приведенном выше примере, чтобы сэкономить место.
- Строка 4 — Когда мы сохраняем команду переменной myvar, все строки новой строки удаляются , а вывод теперь находится в одной строке.
Когда вы играете с подстановкой команд, рекомендуется проверить ваш результат, а не предполагать, что он будет вести себя определенным образом. Самый простой способ сделать это — просто повторить переменную и посмотреть, что произошло. (После этого вы можете удалить команду эха, когда вы будете счастливы.)
Примеры
Здесь мы создадим пять переменных. Формат заключается в вводе имени, знака равенства и значения
Обратите внимание, что нет пробела до или после знака равенства. Присвоение переменной значения часто называется присвоением значения переменной
Мы создадим четыре строковые переменные и одну числовую переменную
меня = Dave
my_boost = Linux
он = Popeye
his_boost = шпинат
this_year = 2019
Чтобы увидеть значение в переменной, используйте команду . Имя переменной должно предшествовать знаку доллара каждый раз, когда вы ссылаетесь на содержащееся в нем значение, как показано ниже:
echo $ my_name
echo $ my_boost
echo $ this_year
Давайте использовать все наши переменные одновременно:
echo "$ my_boost для $ меня, как $ his_boost для $ него (с) $ this_year"
Значения переменных заменяют их имена. Вы также можете изменить значения переменных. Чтобы назначить новое значение переменной , вы просто повторяете то, что делали, когда присваивали первое значение, например:
my_boost = Текила
Если вы повторно запустите предыдущую команду, вы получите другой результат:
echo "$ my_boost для $ меня, как $ his_boost для $ него (с) $ this_year"
Таким образом, вы можете использовать одну и ту же команду, которая ссылается на одни и те же переменные и получить разные результаты, если вы измените значения, содержащиеся в переменных.
Мы поговорим о цитировании переменных позже. На данный момент вот некоторые вещи, которые нужно запомнить:
- Переменная в одинарных кавычках обрабатывается как буквенная строка, а не как переменная.
- Переменные в кавычках рассматриваются как переменные.
- Чтобы получить значение, хранящееся в переменной, необходимо указать знак доллара .
- Переменная без знака доллара предоставляет только имя переменной.
Вы также можете создать переменную, которая берет свое значение из существующей переменной или числа переменных. Следующая команда определяет новую переменную с именем и присваивает ей объединенные значения переменных и :
drink_of-the_Year = "$ my_boost $ this_year"
эхо напиток года
Цитаты
В приведенном выше примере мы сохранили все хорошо и просто. Переменные должны были хранить только одно слово. Если мы хотим, чтобы переменные сохраняли более сложные значения, нам нужно использовать кавычки. Это связано с тем, что при обычных условиях Bash использует пространство для определения отдельных элементов.
Помните, что команды работают точно так же в командной строке, как и в скрипте.
Поскольку команды работают точно так же в командной строке, как в скрипте, иногда бывает легче экспериментировать в командной строке.
Когда мы заключим наш контент в кавычки, мы указываем Bash, что содержимое должно рассматриваться как отдельный элемент. Вы можете использовать одинарные кавычки (‘) или двойные кавычки («).
- Одиночные кавычки будут обрабатывать каждый символ буквально.
- Двойные кавычки позволят вам выполнять подстановку (то есть включают переменные в пределах значения).
Экспорт переменных
Помните, как в предыдущем разделе мы говорили о сценариях, запущенных в их собственном процессе ? Это вводит явление, известное как область действия, которая влияет на переменные между прочим. Идея состоит в том, что переменные ограничены процессом, в котором они были созданы. Нормальный это не проблема, но иногда, например, сценарий может запускать другой скрипт в качестве одной из его команд. Если мы хотим, чтобы переменная была доступна для второго скрипта, нам нужно экспортировать переменную.
script1.sh
Shell
#!/bin/bash
# demonstrate variable scope 1.
var1=blah
var2=foo
# Let’s verify their current value
echo $0 :: var1 : $var1, var2 : $var2
export var1
./script2.sh
# Let’s see what they are now
echo $0 :: var1 : $var1, var2 : $var2
1 |
#!/bin/bash var1=blah var2=foo echo$::var1$var1,var2$var2 export var1 .script2.sh echo$::var1$var1,var2$var2 |
script2.sh
Shell
#!/bin/bash
# demonstrate variable scope 2
# Let’s verify their current value
echo $0 :: var1 : $var1, var2 : $var2
# Let’s change their values
var1=flop
var2=bleh
1 |
#!/bin/bash echo$::var1$var1,var2$var2 var1=flop var2=bleh |
Теперь давайте запустим его и посмотрим, что произойдет.
Вывод выше может показаться неожиданным. Фактически, когда мы экспортируем переменную, мы говорим Bash, что каждый раз, когда создается новый процесс (для запуска другого скрипта или такого), создайте копию переменной и передайте ее новому процессу. Поэтому, хотя переменные имеют одно и то же имя, они существуют в отдельных процессах и поэтому не связаны друг с другом.
Экспорт переменных — односторонний процесс. Первоначальный процесс может передавать переменные новому процессу, но все, что происходит с копией переменных, не влияет на исходные переменные.
Экспорт переменных — это то, что вам, вероятно, не нужно будет беспокоиться о большинстве сценариев Bash, которые вы создадите. Иногда вы можете захотеть разбить конкретную задачу на несколько отдельных сценариев, однако упростить управление или разрешить повторное использование (что всегда хорошо). Например, вы можете создать сценарий, в котором будет скопирована копия всех файлов, экспортированных на определенную переменную, датированной (то есть сегодняшней датой, предшествующей имени файла). Затем вы можете легко вызвать этот скрипт из других сценариев, которые вы создаете, всякий раз, когда вы хотите сделать снимок набора файлов.
Часть 1. Что такое скрипт Bash?
Часть 3. Пользовательский ввод в Bash