Как предотвратить синтаксические ошибки при чтении значений ассоциативного массива BASH, которые содержат косые черты из дочернего процесса? - PullRequest
1 голос
/ 16 апреля 2019

Я использую bash 4.4.19 (1) -релиз.

В начале моей программы я считывал значения конфигурации клиента из командной строки, файла (ов) конфигурации и среды (в порядке убывания приоритета). Я проверяю эти значения конфигурации в соответствии с внутренними определениями, отказывая, если требуемые значения отсутствуют или значения клиента не совпадают с принятыми регулярными выражениями. Этот подход является жестким требованием, и я застрял, используя для этого BASH.

Весь процесс настройки включает в себя анализ нескольких файлов YAML и занимает около секунды. Я хотел бы сделать это только один раз, чтобы сохранить производительность. По завершении все настроенные значения помещаются в глобальный ассоциативный массив, объявленный следующим образом:

declare -gA CONFIG_VALUES

Для доступа к этому массиву была написана базовая вспомогательная функция:

# A wrapper for accessing the CONFIG_VALUES array.
function get_config_value {
    local key="${1^^}"
    local output
    output="${CONFIG_VALUES[${key}]}"
    echo "$output"
}

Это прекрасно работает, когда все команды выполняются в одной оболочке. Это даже работает, когда функция get_config_value вызывается из дочернего процесса. Это нарушается, когда он вызывается из дочернего процесса, а значение в массиве содержит косые черты. Это приводит к ошибкам, таким как следующее (строка 156 «output =» $ {CONFIG_VALUES [$ {key}]} »):

config.sh: line 156: path/to/some/file: syntax error: operand expected (error token is "/to/some/file")

Это особенно неприятно, потому что кажется, что значение "path / to / some / file" просто отлично читает. После этого он просто решает объявить синтаксическую ошибку и падает, не отображая значение.

Я пытался обойти это, запустив поиск массива в подоболочке, зафиксировав синтаксический сбой и обнаружив нужное мне значение:

# A wrapper for accessing the CONFIG_VALUES array.
function get_config_value {
    local key="${1^^}"
    local output
    if output="$(echo "${CONFIG_VALUES[${key}]}" 2>&1)"; then
        echo "$output"
    else
        grep -oP "(?<=: ).*(?=: syntax error: operand expected)" <<< "$output"
    fi
}

К сожалению, похоже, что BASH не позволит мне игнорировать подобную "синтаксическую ошибку". Я не уверен, куда идти отсюда (ну ... Питон, но я не могу принять это решение).

Есть идеи?

...