Создайте шаблон файла и выведите его с установленными переменными

Если вы используете bash, это должно работать:

$ cat env/setenv.sh 
WORKING_DIR="$(dirname "${BASH_SOURCE[0]}")"
printf '%s is located in directory %s\n' \
         "$(basename "${BASH_SOURCE[0]}")" "$(dirname "${BASH_SOURCE[0]}")"

PYT_FILE="$WORKING_DIR/script.pyt"

printf 'Python script %s is located in directory %s\n' \
         "$(basename "${PYT_FILE}")" "$(dirname "${PYT_FILE}")"

printf 'Path to Python script is %s\n' "${PYT_FILE}"

$../env/setenv.sh 
setenv.sh is located in directory./env
Python script script.pyt is located in directory./env
Path to Python script is./env/script.pyt
1
01.09.2021, 13:38
1 ответ

Использование envsubstбудет работать, если значения ваших переменных «хорошие» и не нужно кодировать JSON. Это также требует, чтобы ваши переменные были экспортированы.

Однако, как только у вас есть специальные значения в ваших переменных, это разваливается:

$ jq. file
{
  "set1": {
    "string1": "${VAR1}",
    "string2": "${VAR2}"
  }
}
$ export VAR1='line 1
line 2'
$ export VAR2='"hello"'
$ envsubst <file | jq.
parse error: Invalid string: control characters from U+0000 through U+001F must be escaped at line 4, column 7

Вместо этого обрежьте ${в начале и }в конце значений в файле JSON и используйте оставшуюся строку для поиска значения во внутренней $ENVпеременной (объекта. хранение переменных окружения в виде пар ключей -значений):

$ jq '.[][] |= ( ltrimstr("${") | rtrimstr("}") | $ENV[.] )' file
{
  "set1": {
    "string1": "line 1\nline 2",
    "string2": "\"hello\""
  }
}

.[][]извлекает пути значений, а |=является оператором обновления. Таким образом, значения обновляются путем поиска значений переменных среды, которым они соответствуют, и замены их этими значениями.

С приведенным выше кодомстрока, не соответствующая существующей переменной окружения, будет заменена наnull:

$ jq. file
{
  "set1": {
    "string1": "${VAR1}",
    "string2": "${VAR2}",
    "string3": "${bumblebee}"
  }
}
$ jq '.[][] |= ( ltrimstr("${") | rtrimstr("}") | $ENV[.] )' file
{
  "set1": {
    "string1": "line 1\nline 2",
    "string2": "\"hello\"",
    "string3": null
  }
}
0
01.09.2021, 18:00

Теги

Похожие вопросы