Shell - экспортировать имя переменной в верхнем регистре - PullRequest
0 голосов
/ 15 января 2019

У меня есть скрипт ci, вызываемый из Docker. Он используется для определения нескольких переменных до запуска тестов. Эти переменные имеют свое имя в зависимости от другой переменной в конфигурации ci.

export ${VAR_FROM_CI_CONF^^}_FIRST_TEST_VAR="test"
export ${VAR_FROM_CI_CONF^^}_SECOND_TEST_VAR="test2"

Локально работает, но при запуске ci я получаю syntax error: bad substitution ошибку. Похоже, что не удается интерпретировать верхний регистр в стиле bash.

Мне нужно заменить это, так что если VAR_FROM_CI_CONF "Привет", он экспортирует меня:

export HI_FIRST_TEST_VAR="test"
export HI_SECOND_TEST_VAR="test2"

Спасибо

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Поскольку вы упомянули Docker, я предполагаю, что у вас, вероятно, есть контейнер без установленного bash (это Alpine?), И ваш скрипт выполняется со встроенным sh.

В любом случае, для используемого вами синтаксиса string^^ требуется bash 4.0 и выше, так что вам нужно установить bash.

Если вы используете Alpine linux:

$ apk add --no-cache bash
$ bash
$ HELLO=hi ; echo ${HELLO^^}
=> HI

и тогда вы должны быть на пути.

Конечно, если вы управляете Dockerfile, добавьте к нему установку пакета с помощью:

RUN apk add --no-cache bash

и добавьте шебанг в ваш скрипт, чтобы убедиться, что он выполняется с помощью bash:

#!/usr/bin/env bash
# ...
0 голосов
/ 15 января 2019

Я бы предложил изменить оболочку по умолчанию в вашем контейнере с /bin/sh (или как угодно) на /bin/bash.

Это можно сделать с помощью команды SHELL ["/bin/bash", "-c"] в Dockerfile. Таким образом, вы получите все последующие команды сценария, выполняемые в bash, что хорошо понимает, что такое макрос ^^.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...