#linux #bash #shell
#linux #bash #оболочка
Вопрос:
У меня есть :
COMP_FILE =docker-compose.con-etl.yml
COMP_FILE =${PWD}/docker-compose.abc.yml
COMP_FILE =${PWD}/docker-compose.cde.yml
COMP_FILE =${PWD}/docker-compose.efg.yml
COMP_FILE =${PWD}/docker-compose.hij.yml
COMP_FILE =${PWD}/docker-compose.klm.yml
COMP_FILE =${PWD}/docker-compose.nmo.yml
COMP_FILE =${PWD}/docker-compose.pqr.yml
и мне нужно добавить -f перед каждым docker-compose, например, результат должен быть
-f docker-compose.con-etl.yml -f ${PWD}/datahub/docker-compose.abc.yml -f ${PWD}/datahub/docker-compose.cde.yml -f ${PWD}/datahub/docker-compose.efg.yml -f ${PWD}/datahub/docker-compose.hij.yml -f ${PWD}/datahub/docker-compose.klm.yml -f ${PWD}/datahub/docker-compose.nmo.yml -f ${PWD}/datahub/docker-compose.pqr.yml
я использую приведенную ниже команду, но не могу получить требуемый результат и получаю
COMPOSE_FILE_ARGS=$(echo ${COMPOSE_FILE[@]/#/-f })
-f docker-compose.con-etl.yml${PWD}/datahub/docker-compose.abc.yml${PWD}/datahub/docker-compose.cde.yml${PWD}/datahub/docker-compose.efg.yml${PWD}/datahub/docker-compose.hij.yml${PWD}/datahub/docker-compose.klm.yml${PWD}/datahub/docker-compose.nmo.yml${PWD}/datahub/docker-compose.pqr.yml
кто-нибудь может мне помочь
Комментарии:
1. Где рекурсивная часть? Что вы действительно хотите сделать? Что такое ввод? Это всего лишь одна переменная. Почему бы вам просто
COMP_FILE='-f docker-compose.yml -f another_docker'
не?2. COMP_FILE — это рекурсивно расширяемая переменная, и есть ли какой-либо способ, если я могу добавить -f в COMP_FILE
3. Он не расширяется рекурсивно, здесь нет рекурсии. Он добавляется. Это просто строка. И вы добавляете в конец строки новый путь к docker. Просто добавьте с
-f
помощью . И не забудьте добавить пробелы к переменной.4. да, вы можете сказать, что это добавляется, но в «MAKE» оно называется рекурсивно расширенным
5. 1. Это не make и не makefile, а сценарий оболочки. 2. Это не рекурсивное расширение в make. Рекурсивное расширение происходит, когда у вас есть одна переменная со значением, а затем вторая переменная со строкой
$(first_var_name)
. Затем расширение второй переменной приводит к ее двойному расширению. Расширение происходит до тех пор, пока все$( ... )
не будут разрешены. 3. Вы добавляете строку к переменной. Почему бы вам не добавить его с-f
помощью пробелов и?COMP_FILE =docker-compose.con-etl.yml ; COMP_FILE =' -f '; COMP_FILE =${PWD}/docker-compose.abc.yml ; ... etc.
4. Still=
называется «добавлением» в make
Ответ №1:
Вы могли бы использовать cat
и sed
:
$ cat <<'end' | sed 's/=/=" -f /;s/$/"/' > script.sh
COMP_FILE=docker-compose.con-etl.yml
COMP_FILE =${PWD}/docker-compose.abc.yml
COMP_FILE =${PWD}/docker-compose.cde.yml
COMP_FILE =${PWD}/docker-compose.efg.yml
COMP_FILE =${PWD}/docker-compose.hij.yml
COMP_FILE =${PWD}/docker-compose.klm.yml
COMP_FILE =${PWD}/docker-compose.nmo.yml
COMP_FILE =${PWD}/docker-compose.pqr.yml
end
затем сгенерированный script.sh чтобы получить:
$ . script.sh
$ echo $COMP_FILE
-f docker-compose.con-etl.yml -f /home/sergioro/docker-compose.abc.yml -f /home/sergioro/docker-compose.cde.yml -f /home/sergioro/docker-compose.efg.yml -f /home/sergioro/docker-compose.hij.yml -f /home/sergioro/docker-compose.klm.yml -f /home/sergioro/docker-compose.nmo.yml -f /home/sergioro/docker-compose.pqr.yml
Ответ №2:
У вас есть несколько проблем. Вы не создаете массив, вы создаете длинную строку в качестве первого элемента. Чтобы создать массив с помощью команды в качестве каждого элемента, вам необходимо заключить значения, присвоенные массиву, в (...)
круглые скобки, например
COMP_FILE =(docker-compose.con-etl.yml)
COMP_FILE =(${PWD}/docker-compose.abc.yml)
COMP_FILE =(${PWD}/docker-compose.cde.yml)
COMP_FILE =(${PWD}/docker-compose.efg.yml)
COMP_FILE =(${PWD}/docker-compose.hij.yml)
COMP_FILE =(${PWD}/docker-compose.klm.yml)
COMP_FILE =(${PWD}/docker-compose.nmo.yml)
COMP_FILE =(${PWD}/docker-compose.pqr.yml)
Чтобы выполнить итерацию по добавлению массива "-f "
в качестве префикса к каждой команде, вы можете использовать цикл for в стиле C для перебора каждого присваивания индекса "-f "
в качестве префикса:
for ((i = 0; i < ${#COMP_FILE[@]}; i )); do
COMP_FILE[i]="-f ${COMP_FILE[i]}"
done
Чтобы подтвердить, что префиксы были добавлены, просто выведите результирующий массив,
for i in "${COMP_FILE[@]}"; do
echo "$i"
done
Вывод
$ bash yamlfile.sh
-f docker-compose.con-etl.yml
-f /tmp/tmp-david/docker-compose.abc.yml
-f /tmp/tmp-david/docker-compose.cde.yml
-f /tmp/tmp-david/docker-compose.efg.yml
-f /tmp/tmp-david/docker-compose.hij.yml
-f /tmp/tmp-david/docker-compose.klm.yml
-f /tmp/tmp-david/docker-compose.nmo.yml
-f /tmp/tmp-david/docker-compose.pqr.yml
Дайте мне знать, если у вас возникнут дополнительные вопросы.
Редактировать по запросу всех в одной строке
У вас есть информация, хранящаяся в массиве, как вам было нужно. Вы помещаете это в любой формат, который вам нравится, например, «все в одной строке»
echo "${COMP_FILE[@]}"
-f docker-compose.con-etl.yml -f /tmp/tmp-david/docker-compose.abc.yml -f /tmp/tmp-david/docker-compose.cde.yml -f /tmp/tmp-david/docker-compose.efg.yml -f /tmp/tmp-david/docker-compose.hij.yml -f /tmp/tmp-david/docker-compose.klm.yml -f /tmp/tmp-david/docker-compose.nmo.yml -f /tmp/tmp-david/docker-compose.pqr.yml
Вы можете просто использовать расширение всех элементов массива в любой необходимой команде, обеспечивая при этом, чтобы каждый компонент был "-f ......"
.
Дайте мне знать, если это не поможет вам.
Комментарии:
1. : большое спасибо за помощь, но решение приходит построчно, однако мне нужно все в одной строке, например -f docker-compose.con-etl.yml -f /home/sergioro/docker-compose.abc.yml -f /home/sergioro/docker-compose.cde.yml -f /home/sergioro/docker-compose.efg.yml -f /home/sergioro/docker-compose.hij.yml -f /home/sergioro/docker-compose.klm.yml -f /home/sergioro/docker-compose.nmo.yml -f /home/sergioro/docker-compose.pqr.yml
2. @AnkurSharma — он уже был сохранен таким образом в массиве. Он выводился с разрывами строк, чтобы результат не прокручивался со страницы. Вы просто используете
"${COMP_FILE[@]}"
для всей строки, как вы просили.