📜 Создание переменных, доступных только для чтения, а также неизменяемых переменных в Bash |

📜 Создание переменных, доступных только для чтения, а также неизменяемых переменных в Bash

Скрипты

Иногда немного дополнительной ясности может быть очень полезно, например, четко указать, что переменная не будет меняться.

Внутри функции в 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, вы можете быть уверены, что больше ничего не измените, а если измените, то скрипт выдаст ошибку, что поможет избежать случайной перезаписи значения.

см. также:

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий