добавить префикс к рекурсивно расширяемой переменной в оболочке

#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[@]}" для всей строки, как вы просили.