Переменные в Bash
Содержание
Переменные - одна из тех вещей, которые на самом деле довольно просты в использовании, но также довольно легко попасть в проблему, если вы неправильно понимаете, как они работают. Таким образом, в этом разделе есть немного чтения, но если вы потратите время на то, чтобы пройти и понять это, вы будете благодарны за то, что позже вы начали заниматься более сложными сценариями.
Для тех из вас, кто раньше занимался программированием, вы будете хорошо знакомы с переменными. Для тех из вас, кто этого не сделал, подумайте о переменной как временном хранилище для простой информации. Эти переменные могут быть очень полезными для того, чтобы мы могли управлять и контролировать действия нашего скрипта Bash. Мы рассмотрим различные способы, с помощью которых переменные будут иметь свои данные и способы, которыми мы можем их использовать.
Как они работают?
Переменная является временным хранилищем для части информации. Для переменных можно выполнить два действия:
- Установка значения для переменной.
- Чтение значения переменной.
Переменные могут иметь значение, определенное несколькими различными способами. Наиболее распространенными являются установка значения непосредственно и его значение, которое должно быть установлено в результате обработки командой или программой. Вы увидите примеры обоих ниже.
Чтобы прочитать переменную, мы помещаем ее имя (которому предшествует знак $) в любом месте сценария, который нам нужен. Прежде чем Bash интерпретирует (или запускает) каждую строку нашего скрипта, он сначала проверяет, имеются ли какие-либо имена переменных. Для каждой переменной, которую она идентифицировала, она заменяет имя переменной своим значением. Затем он запускает эту строку кода и снова запускает процесс на следующей строке.
Вот несколько быстрых точек синтаксиса. Они будут подробно рассмотрены и продемонстрированы ниже.
- При указании или чтении переменной мы помещаем знак $ перед именем переменной.
- При установке переменной мы оставляем знак $.
- Некоторым людям нравится писать имена переменных в верхнем регистре, чтобы они выделялись. Это ваше предпочтение. Они могут быть все прописными буквами, все строчными буквами или смесью.
- Переменная может быть размещена в любом месте сценария (или в командной строке, если на то пошло), а при запуске Bash заменит его значением переменной. Это стало возможным, поскольку замена выполняется до запуска команды.
Аргументы командной строки
Аргументы командной строки обычно используются и просты в работе, поэтому они являются хорошим местом для начала.
Когда мы запускаем программу в командной строке, вы будете знакомы с предоставлением аргументов после нее, чтобы контролировать ее поведение. Например , мы могли бы выполнить команду Ls -l / и т.д. . -l и / etc - оба аргумента командной строки для команды ls . Мы можем сделать подобное с нашими сценариями bash. Для этого мы используем переменные $ 1 для представления первого аргумента командной строки, $ 2 для представления второго аргумента командной строки и т. д. Они автоматически устанавливаются системой, когда мы запускаем наш скрипт, поэтому все, что нам нужно сделать, это обратиться к ним.
Давайте посмотрим на пример mycopy.sh
#!/bin/bash # Простой сценарий копирования cp $1 $2 # Давайте проверим, что копия работала echo Details for $2 ls -lh $2
Давайте разберем это:
- Строка 4 - запустите команду cp с первым аргументом командной строки в качестве источника и второго аргумента командной строки в качестве адресата.
- Строка 8 - запуск эха команды для печати сообщения.
- Строка 9 - После завершения копирования запустите команду ls для адресата, чтобы убедиться, что она сработала. Мы включили опции l, чтобы показать нам дополнительную информацию и h, чтобы сделать размер читаемым человеком, чтобы мы могли проверить его правильность копирования.
Мы обсудим их использование немного больше в следующей статье.
Другие специальные переменные
Есть несколько других переменных, которые система устанавливает и для вас.
- $0 - имя скрипта Bash.
- $1-$9 - Первые 9 аргументов для скрипта Bash. (Как уже упоминалось выше.)
- $# - Сколько аргументов было передано скрипту Bash.
- $@ - Все аргументы, предоставленные сценарию Bash.
- $?- Статус выхода последнего процесса.
- $$ - Идентификатор процесса текущего скрипта.
- $USER - имя пользователя, выполняющего скрипт.
- $HOSTNAME - имя хоста, на котором запущен скрипт.
- $SECONDS - количество секунд с момента запуска скрипта.
- $RANDOM - Возвращает другое случайное число каждый раз, когда он упоминается.
- $LINENO - возвращает текущий номер строки в сценарии Bash.
Если вы введете команду env в командной строке, вы увидите список других переменных, к которым вы также можете обратиться.
Некоторые из этих переменных могут показаться вам полезными. Другие не могут. По мере продвижения к более сложным сценариям в последующих разделах вы увидите примеры того, как они могут быть полезны.
Настройка собственных переменных
Помимо переменных, которые заданы системой, мы можем также установить собственные переменные. Это может быть полезно для отслеживания результатов команд и возможности ссылаться на них и обрабатывать их позже.
Существует несколько способов, которыми могут быть заданы переменные (например, часть выполнения команды), но базовая форма следует этому шаблону:
переменная = значение
Это одна из тех областей, где важно форматирование. Обратите внимание, что по обе стороны от знака равенства (=) нет места. Мы также оставляем знак $ с начала имени переменной при настройке.
Имена переменных могут быть прописными или строчными буквами или смесью обоих, но Bash - это среда, чувствительная к регистру, поэтому всякий раз, когда вы ссылаетесь на переменную, вы должны быть последовательны при использовании прописных и строчных букв. Вы всегда должны убедиться, что имена переменных являются описательными. Это облегчает вам задачу.
Вот простой пример, иллюстрирующий их использование.
#!/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 просто потому, что это удобный способ продемонстрировать, что переменные действительно были установлены. эхо не требуется для использования переменных и используется только тогда, когда вы хотите напечатать определенное сообщение на экране. (Практически все команды печатают вывод на экран по умолчанию, поэтому вам не нужно помещать эхо перед ними.)
Переменные могут быть полезны для упрощения управления нашими сценариями. Возможно, наш скрипт будет запускать несколько команд, некоторые из которых будут ссылаться на конкретный каталог. Вместо того, чтобы вводить эту директорию каждый раз, когда мы можем установить ее один раз в переменной, обратитесь к этой переменной. Затем, если требуемый каталог изменится в будущем, нам нужно обновить только одну переменную, а не каждый экземпляр внутри скрипта.
Цитаты
В приведенном выше примере мы сохранили все хорошо и просто. Переменные должны были хранить только одно слово. Если мы хотим, чтобы переменные сохраняли более сложные значения, нам нужно использовать кавычки. Это связано с тем, что при обычных условиях Bash использует пространство для определения отдельных элементов.
- Помните, что команды работают точно так же в командной строке, как и в скрипте.
Поскольку команды работают точно так же в командной строке, как в скрипте, иногда бывает легче экспериментировать в командной строке.
Когда мы заключим наш контент в кавычки, мы указываем Bash, что содержимое должно рассматриваться как отдельный элемент. Вы можете использовать одинарные кавычки (') или двойные кавычки (").
- Одиночные кавычки будут обрабатывать каждый символ буквально.
- Двойные кавычки позволят вам выполнять подстановку (то есть включают переменные в пределах значения).
Замена команды
Подстановка команд позволяет нам выводить вывод команды или программы (что обычно печатается на экране) и сохранять ее как значение переменной. Для этого мы помещаем его в скобки, которому предшествует знак $.
Подстановка команд хороша и проста, если вывод команды - это одно слово или строка. Если выход идет по нескольким строкам, то новые строки просто удаляются, и весь вывод заканчивается на одной строке.
Давайте разберем это:
- Строка 1 - Запустим команду ls . Обычно его выход будет состоять из нескольких строк. Я немного сократил его в приведенном выше примере, чтобы сэкономить место.
- Строка 4 - Когда мы сохраняем команду переменной myvar, все строки новой строки удаляются , а вывод теперь находится в одной строке.
Когда вы играете с подстановкой команд, рекомендуется проверить ваш результат, а не предполагать, что он будет вести себя определенным образом. Самый простой способ сделать это - просто повторить переменную и посмотреть, что произошло. (После этого вы можете удалить команду эха, когда вы будете счастливы.)
Экспорт переменных
Помните, как в предыдущем разделе мы говорили о сценариях, запущенных в их собственном процессе ? Это вводит явление, известное как область действия, которая влияет на переменные между прочим. Идея состоит в том, что переменные ограничены процессом, в котором они были созданы. Нормальный это не проблема, но иногда, например, сценарий может запускать другой скрипт в качестве одной из его команд. Если мы хотим, чтобы переменная была доступна для второго скрипта, нам нужно экспортировать переменную.
script1.sh
#!/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
script2.sh
#!/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
Теперь давайте запустим его и посмотрим, что произойдет.
Вывод выше может показаться неожиданным. Фактически, когда мы экспортируем переменную, мы говорим Bash, что каждый раз, когда создается новый процесс (для запуска другого скрипта или такого), создайте копию переменной и передайте ее новому процессу. Поэтому, хотя переменные имеют одно и то же имя, они существуют в отдельных процессах и поэтому не связаны друг с другом.
Экспорт переменных - односторонний процесс. Первоначальный процесс может передавать переменные новому процессу, но все, что происходит с копией переменных, не влияет на исходные переменные.
Экспорт переменных - это то, что вам, вероятно, не нужно будет беспокоиться о большинстве сценариев Bash, которые вы создадите. Иногда вы можете захотеть разбить конкретную задачу на несколько отдельных сценариев, однако упростить управление или разрешить повторное использование (что всегда хорошо). Например, вы можете создать сценарий, в котором будет скопирована копия всех файлов, экспортированных на определенную переменную, датированной (то есть сегодняшней датой, предшествующей имени файла). Затем вы можете легко вызвать этот скрипт из других сценариев, которые вы создаете, всякий раз, когда вы хотите сделать снимок набора файлов.
Часть 1. Что такое скрипт Bash?
Часть 3. Пользовательский ввод в Bash