Команда declare в Bash используется для определения, изменения и отображения переменных и функций. В Bash-скриптах основная цель команды declare
— задавать атрибуты для переменных и функций и отображать их текущее состояние.
В этой статье мы научимся использовать команду declare
в скриптах Bash на примере Linux.
Команда declare
часто используется для определения переменных с определенными атрибутами.
declare my_var="Hello, World!" echo "$my_var"
declare -u upper_var="hello world" echo "$upper_var" # Outputs "HELLO WORLD"
-u
флаг преобразует значение upper_var
в верхний регистр.
declare -l lower_var="HELLO WORLD" echo "$lower_var" # Outputs "hello world"
Флаг -l
преобразует значение lower_var
в нижний регистр.
declare -p
Здесь показаны все переменные и их значения.
declare -p my_var
Выходной сигнал:
declare -- my_var="Hello, World!"
declare --
означает, что это обычная переменная без специальных атрибутов.
declare
-r
)Установите переменную, доступную только для чтения:
declare -r readonly_var="Fixed Value" readonly_var="New Value" # Это вызовет ошибку
Флаг -r
делает readonly_var
доступным только для чтения. Попытка изменить его приведёт к ошибке. После установки его нельзя будет изменить.
-i
)Bash будет обрабатывать переменную как число и выполнять вычисления автоматически.
declare -i num=10 num+=5 echo "$num" # Вывод: 15
Флаг -i
делает num
целым числом. Если вы присвоите нецелое значение, по умолчанию будет 0
.
Если вы попытаетесь присвоить нечисловое значение, оно будет проигнорировано:
num="hello" echo "$num" # It will display 0.
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[@]}" # Вывод: яблоко вишня дата
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!
-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
делают переменные доступными для подоболочек.
declare
Как я уже упоминал, команда declare
позволяет задавать различные атрибуты для переменных и функций. Например, чтобы сделать переменную локальной для функции:
my_function() { declare -l local_var="Это локальная переменная" echo "$local_var" }
-l
флаг делает local_var
функцию локальной.
Если вы вызовете функцию:
my_function
Результатом будет:
this is local
Несмотря на то, что "This is local"
содержит заглавные буквы, declare -l
заставляет все символы быть строчными.
-f
)declare -f
Здесь отображаются все определенные функции вместе с их содержимым.
-F
)declare -F
Здесь показаны только имена функций без их определений.
declare -xf my_function
Флаг -xf
делает my_function
доступным для дочерних процессов (например, скриптов или подоболочек).
Команду declare
также можно использовать для проверки существования переменной или функции:
if declare -p variable_name &>/dev/null; then echo "Variable exists" fi
Замените variable_name
фактическим именем.
Помните, что мы используем -i
при объявлении переменной. Мы можем использовать +
вместо -
для удаления атрибута. Например:
declare +i num # Удаляет целочисленный атрибут из `num`.
Теперь вы можете присвоить другой атрибут (например, строку) без каких-либо ошибок:
num=hello
Чтобы проверить это, выведите значение переменной:
echo $num
Он должен выводить hello
.
Обратите внимание, что declare +i num
удаляет целочисленный атрибут, но не отменяет и не удаляет переменную.
Мы можем удалить переменные или функции с помощью 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. В основном она используется для:
Надеюсь, это поможет.