首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在shell中为递归展开的变量添加前缀

在shell中为递归展开的变量添加前缀
EN

Stack Overflow用户
提问于 2019-04-16 01:51:33
回答 2查看 46关注 0票数 0

我有:

代码语言:javascript
复制
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

我需要在每个docker-compose之前添加-f,例如结果应该是

代码语言:javascript
复制
-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

我正在使用下面的命令,但无法获得所需的结果

代码语言:javascript
复制
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 

有人能帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2019-04-16 02:12:12

你有几个问题。您不是在创建数组,而是在创建一个长字符串作为第一个元素。要使用命令作为每个元素创建数组,需要将分配给数组的值括在(...)括号中,例如

代码语言:javascript
复制
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 "作为前缀添加到每个命令的数组,可以使用C风格的for循环遍历每个索引,并将"-f "指定为前缀:

代码语言:javascript
复制
for ((i = 0; i < ${#COMP_FILE[@]}; i++)); do
    COMP_FILE[i]="-f ${COMP_FILE[i]}"
done

要确认添加了前缀,只需输出结果数组,

代码语言:javascript
复制
for i in "${COMP_FILE[@]}"; do
    echo "$i"
done

输出

代码语言:javascript
复制
$ 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

如果您有进一步的问题,请告诉我。

按请求编辑一行中的所有内容

您可以根据需要将信息存储在数组中。你可以把它放在任何你喜欢的格式中,例如"all in one line“

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-04-16 02:53:47

您可以使用catsed

代码语言:javascript
复制
$ 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进行源码获取:

代码语言:javascript
复制
$ . 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55694773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档