Иногда немного дополнительной ясности может быть очень полезно, например, четко указать, что переменная не будет меняться.
Внутри функции в Bash вы можете использовать ключевое слово local для определения переменной, и она может быть доступна только для чтения с помощью флага -r.
Вот несколько примеров использования и результатов:
#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset
function mutable {
local status="pending"
status="completed"
# This line will echo "completed".
echo "${status}"
}
function immutable {
local -r status="pending"
# This line throws an error: "status: readonly variable"
status="completed"
# This line is never reached.
echo "${status}"
}
mutable
immutable
Если вы хотите объявить переменные только для чтения вне функции, вы можете использовать declare -r status=”pending”, в то время как declare status=”pending” или status=”pending” оба являются изменяемыми.
В случае с read-only вы получите ту же ошибку, что и выше, если попытаетесь ее изменить.
Помните, что declare и local не соответствуют POSIX, поэтому, если вам нужна максимальная совместимость между оболочками, вам стоит рассмотреть другие варианты, например, использование readonly status=”pending”.
Я предпочитаю использовать declare -r, когда знаю, что мне не нужно соответствие POSIX, потому что declare используется для других вещей, например, для определения ассоциативных массивов.
Наконец, стоит отметить, что если вы попытаетесь снять значение переменной, например unset status, а она доступна только для чтения, то получите сообщение об ошибке, в котором будет сказано, что вы не можете снять значение переменных, доступных только для чтения.
Ясно выражать свои намерения полезно при чтении кода.
Если в большом скрипте вы видите readonly, declare -r или local -r, вы можете быть уверены, что больше ничего не измените, а если измените, то скрипт выдаст ошибку, что поможет избежать случайной перезаписи значения.
см. также:
- 📜 Bash скрипт для копирования всех файлов с той же структурой каталогов
- 🖧 Как проверить доступные сетевые интерфейсы, связанные IP-адреса, MAC-адреса и скорость интерфейса на Linux
- 📜 Как сохранить конфигурацию в shell скрипте
- 📜 Скрипты Bash: Как заархивировать все файлы в каталоге
- 📜 Как вызвать один скрипт bash из другого скрипта