Конечно, можно использовать это для удаления кучи условий if, когда есть несколько наборов переменных env для разных окружений.
Подход, который мы будем использовать, совместим с Bash 3.2+, что очень удобно, если вы хотите, чтобы он работал “из коробки” на macOS.
#!/usr/bin/env bash set -o errexit set -o pipefail set -o nounset # Представьте, что у вас есть несколько переменных окружения для нескольких сред, таких как. # как TEST, STAGING и PROD. Обычно они существуют в файле .env и # передаются с помощью `. .env", я оставил их здесь, чтобы они были самостоятельными. export TEST_API_KEY="abc123" export STAGING_API_KEY="def456" export PROD_API_KEY="ghi789" # Теперь представьте, что у вас есть shell-скрипт, где первым аргументом является env, с которым вы # с которым вы хотите работать, например, `./demo TEST ...` или `./demo PROD ...`. ENV="${1}" # И теперь вы хотите использовать значение API_KEY конкретного окружения. # переменной. На данный момент не имеет значения, из какого окружения она получена. API_KEY="${ENV}_API_KEY" # Здесь мы можем получить доступ как к имени переменной, так и к ее значению. Вы можете захотеть # использовать любой из них в зависимости от вашего случая echo "${API_KEY}=${!API_KEY}"
Если бы вы запустили этот скрипт вот так ./demo TEST, то получили бы в ответ API_KEY=abc123.
Использование ${!API_KEY} называется косвенным расширением.
Это описано в официальной документации по Bash.
Без использования динамических переменных вы можете решить ту же проблему, но вы можете написать код, который выглядит следующим образом:
if [ "${ENV}" == "TEST" ]; then
API_KEY="${TEST_API_KEY}"
elif [ "${ENV}" == "STAGING" ]; then
API_KEY="${STAGING_API_KEY}"
elif [ "${ENV}" == "PROD" ]; then
API_KEY="${PROD_API_KEY}"
else
echo "Invalid environment!" && exit 1
fi
Теперь, если вы прочтете echo “${API_KEY}”, то получите abc123, если ENV=”TEST”.
Не то чтобы приведенный выше код был ужасен.
Можно привести доводы в пользу того, что он более прост, но он может быстро стать менее удобным для обслуживания.
Если у вас есть куча переменных окружения, я думаю, что использование динамических переменных является более чистым решением, оно уменьшает количество дублирований при объявлении одной и той же переменной для каждого окружения.
Выше приведен лишь один из примеров использования динамических переменных.
см. также:
- 🐧 Как установить и перечислить переменные среды в Linux
- 📜 Как вызвать один скрипт bash из другого скрипта
- 🐧 Проверка, содержит ли переменная число на Bash
- 📜 Сравнение строк на Bash
- 🐧 Bash скрипты: Пример установки переменных
- 📜 Как использовать шаблоны внутри bash скриптов
- 🐧 Как отлажидить / проверить скрипты Bash