load_env.sh 1.27 KB
#!/bin/bash
#
# Shared .env loader. Uses standard .env format:
#   KEY=value
#   KEY="value with spaces"
#   KEY='value'
#
# Values with special chars (#, $, spaces) should be quoted in .env.
# Usage: source scripts/lib/load_env.sh && load_env_file /path/to/.env
#
load_env_file() {
  local env_file="${1:-}"
  [[ -z "${env_file}" || ! -f "${env_file}" ]] && return 0

  while IFS= read -r line || [[ -n "${line}" ]]; do
    line="${line%$'\r'}"
    [[ -z "${line//[[:space:]]/}" ]] && continue
    [[ "${line}" =~ ^[[:space:]]*# ]] && continue
    [[ "${line}" != *=* ]] && continue

    local key="${line%%=*}"
    local value="${line#*=}"
    key="${key#"${key%%[![:space:]]*}"}"
    key="${key%"${key##*[![:space:]]}"}"
    value="${value#"${value%%[![:space:]]*}"}"
    value="${value%"${value##*[![:space:]]}"}"

    # Strip surrounding quotes (standard .env behavior)
    if [[ ${#value} -ge 2 ]]; then
      local first="${value:0:1}"
      local last="${value: -1}"
      if [[ ("${first}" == '"' && "${last}" == '"') || ("${first}" == "'" && "${last}" == "'") ]]; then
        value="${value:1:${#value}-2}"
      fi
    fi

    # Safe export: %q produces shell-quoted string for values with spaces/special chars
    eval "$(printf 'export %s=%q\n' "$key" "$value")"
  done < "${env_file}"
}