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

см. также:

 



2024-03-05T15:57:29
Скрипты