Команда declare в Bash используется для определения, изменения и отображения переменных и функций. В Bash-скриптах основная цель команды declare
— задавать атрибуты для переменных и функций и отображать их текущее состояние.
В этой статье мы научимся использовать команду declare
в скриптах Bash на примере Linux.
1. Базовое использование команды declare в Bash
1.1. Определите переменную
Команда declare
часто используется для определения переменных с определенными атрибутами.
declare my_var="Hello, World!" echo "$my_var"
1.2. Сделайте переменную заглавной
declare -u upper_var="hello world" echo "$upper_var" # Outputs "HELLO WORLD"
-u
флаг преобразует значение upper_var
в верхний регистр.
1.3. Сделайте переменную строчной
declare -l lower_var="HELLO WORLD" echo "$lower_var" # Outputs "hello world"
Флаг -l
преобразует значение lower_var
в нижний регистр.
2. Перечисление переменных и их значений
2.1. Перечислите все переменные
declare -p
Здесь показаны все переменные и их значения.
2.2. Перечислите конкретную переменную
declare -p my_var
Выходной сигнал:
declare -- my_var="Hello, World!"
declare --
означает, что это обычная переменная без специальных атрибутов.
3. Особые атрибуты с declare
3.1. Сделайте переменную доступной только для чтения (-r
)
Установите переменную, доступную только для чтения:
declare -r readonly_var="Fixed Value" readonly_var="New Value" # Это вызовет ошибку
Флаг -r
делает readonly_var
доступным только для чтения. Попытка изменить его приведёт к ошибке. После установки его нельзя будет изменить.
3.2. Принудительно принять переменную в виде целого числа (-i
)
Bash будет обрабатывать переменную как число и выполнять вычисления автоматически.
declare -i num=10 num+=5 echo "$num" # Вывод: 15
Флаг -i
делает num
целым числом. Если вы присвоите нецелое значение, по умолчанию будет 0
.
Если вы попытаетесь присвоить нечисловое значение, оно будет проигнорировано:
num="hello" echo "$num" # It will display 0.
3.3. Задайте переменную в виде индексированного массива
declare -a my_array=("apple" "banana" "cherry")
-a
флаг создает my_array
индексированный массив.
Чтобы распечатать весь массив целиком, вы можете использовать:
echo "${my_array[@]}"
Пример вывода:
apple banana cherry
Для доступа к отдельным элементам из массива:
echo "${my_array[0]}" # Вывод: яблоко echo "${my_array[1]}" # Вывод: банан echo "${my_array[2]}" # Вывод: вишня
Перебор по массиву:
for item in "${my_array[@]}"; do echo "$item" done
Получение длины массива:
echo "${#my_array[@]}" # Вывод: 3
Добавление нового элемента:
my_array+=("date") echo "${my_array[@]}" # Вывод: яблоко банан вишня дата
Удаление элемента:
Чтобы удалить второй элемент (banana
по индексу 1
):
unset my_array[1] echo "${my_array[@]}" # Вывод: яблоко вишня дата
3.4. Задайте переменную в виде ассоциативного массива (Bash 4+)
declare -A my_assoc_array=([fruit]="apple" [color]="red")
В Bash это создаёт ассоциативный массив (также называемый словарём или хэш-картой), в котором ключи (вместо числовых индексов) сопоставляются с определёнными значениями.
-A
флаг создает my_assoc_array
ассоциативный массив (пары ключ-значение).
Доступ к элементам:
echo "${my_assoc_array[fruit]}" # Вывод: яблоко echo "${my_assoc_array[color]}" # Вывод: красный
Печать всех Ключей:
echo "${!my_assoc_array[@]}" # Вывод: цвет плода
Печать всех значений:
echo "${my_assoc_array[@]}" # Вывод: яблоко красное
Перебор по массиву:
for key in "${!my_assoc_array[@]}"; do echo "$key => ${my_assoc_array[$key]}" done
Выходной сигнал:
fruit => apple color => red
Добавление новой пары Ключ-значение:
my_assoc_array[shape] = "circle"; echo "${!my_assoc_array[@]}"; # Вывод: цвет плода форма echo "${my_assoc_array[shape]}"; # Вывод: круг
Извлечение ключа
unset my_assoc_array[цвет] echo "${!my_assoc_array[@]}" # Вывод: форма плода
Проверка наличия Ключа:
if [[ -v my_assoc_array[fruit] ]]; then echo "Key 'fruit' exists!" fi
Выходной сигнал:
Key 'fruit' exists!
3.5. Экспортировать переменную в подоболочки (-x
)
Это делает переменную доступной для дочерних процессов.
declare -x my_env_var="Exported Value"
Эта команда создаёт переменную среды (my_env_var
) и делает её доступной для дочерних процессов (например, для новой оболочки Bash).
bash -c 'echo "\$my_env_var"' # Вывод: экспортированное значение
Что произойдет, если мы не будем использовать declare -x
?
my_env_var="Not Exported" bash -c 'echo "$my_env_var"'
Вы увидите пустой вывод.
Без -x
переменная существует только в текущей оболочке и не передаётся дочерним процессам.
В качестве альтернативы мы можем использовать export
вместо declare -x
.
export my_env_var="Exported Value"
Оба declare -x
и export
делают переменные доступными для подоболочек.
4. Управление функциями с помощью declare
4.1. Настройка атрибутов для функций
Как я уже упоминал, команда declare
позволяет задавать различные атрибуты для переменных и функций. Например, чтобы сделать переменную локальной для функции:
my_function() { declare -l local_var="Это локальная переменная" echo "$local_var" }
-l
флаг делает local_var
функцию локальной.
Если вы вызовете функцию:
my_function
Результатом будет:
this is local
Несмотря на то, что "This is local"
содержит заглавные буквы, declare -l
заставляет все символы быть строчными.
4.2. Перечислите все функции (-f
)
declare -f
Здесь отображаются все определенные функции вместе с их содержимым.
4.3. Перечислите только названия функций (-F
)
declare -F
Здесь показаны только имена функций без их определений.
4.4. Экспорт функции
declare -xf my_function
Флаг -xf
делает my_function
доступным для дочерних процессов (например, скриптов или подоболочек).
5. Проверьте, существует ли переменная или функция
Команду declare
также можно использовать для проверки существования переменной или функции:
if declare -p variable_name &>/dev/null; then echo "Variable exists" fi
Замените variable_name
фактическим именем.
6. Удалите атрибуты
Помните, что мы используем -i
при объявлении переменной. Мы можем использовать +
вместо -
для удаления атрибута. Например:
declare +i num # Удаляет целочисленный атрибут из `num`.
Теперь вы можете присвоить другой атрибут (например, строку) без каких-либо ошибок:
num=hello
Чтобы проверить это, выведите значение переменной:
echo $num
Он должен выводить hello
.
Обратите внимание, что declare +i num
удаляет целочисленный атрибут, но не отменяет и не удаляет переменную.
7. Сброс настроек переменных и функций
Мы можем удалить переменные или функции с помощью unset
команды.
Чтобы удалить переменную:
unset my_var
Чтобы удалить функцию:
unset -f function_name
Пример: Объединение управления переменными и функциями
Следующий пример показывает, как declare
можно использовать как для переменных, так и для функций:
# Объявите целочисленную переменную declare -i num=10 # Объявите переменную только для чтения declare -r readonly_var="This cannot be changed" # Объявите функцию my_function() { declare -l local_var="This is local" echo "$local_var" } # Выведите список всех функций declare -F # Просмотрите определение my_function declare -f my_function
Краткое описание declare
вариантов
Вариант | Цель |
---|---|
-a |
Объявите индексированный массив. |
-A |
Объявите ассоциативный массив (Bash 4+). |
-i |
Объявите целочисленную переменную. |
-r |
Объявите переменную или функцию, доступную только для чтения. |
-x |
Экспортируйте переменную или функцию в среду. |
-f |
Отобразите определение функции. |
-F |
Отобразите названия всех функций. |
-l |
Преобразуйте значение в нижний регистр (для переменных). |
-u |
Преобразуйте значение в верхний регистр (для переменных). |
-p |
Отображение атрибутов и значения переменной. |
Заключение
Команда declare
— одна из полезных команд в расширенных сценариях Bash. В основном она используется для:
- Определяйте переменные с определёнными атрибутами (например, целые числа, массивы, только для чтения) и управляйте ими,
- Определяйте функции и управляйте ими (например, перечисляйте, просматривайте или экспортируйте их),
- Устанавливайте или удаляйте атрибуты для переменных и функций.
Надеюсь, это поможет.