【发布时间】:2021-06-09 12:46:14
【问题描述】:
目前,我的主要项目存在于一个配置过程之外,用于构建支持 Docker 环境的部署/生产服务器,我选择在 Bash 中进行。也许这很糟糕,但对我来说挑战很大。我已经为它构建了一个结构,该结构依赖于具有自己任务的文件,以及不同类型的功能,以使其表现为框架类型的部署。我花了很多时间重建它并改进自己,因为这是我真正想要完成的第一个项目,至少我想完成智能行为。
但在过去的几天里,我为我正在写的一个部分考虑了一个解决方案; 任务是确保已创建目录的快捷方式集合并填充 Git 存储库内容,并且我想从那里执行部署。此目的地的这些存储库主要是支持 Docker 映像或 Git 挂钩部署的配置文件。但是,我使用不同类型的数组列表:
DEPLOYMENT_DIRECTORY_ASSIGNMENT=(
"layer_1:layer_2:server-deployment-repository"
"layer_1:layer_2:layer_3:deployment-hooks-repository"
"layer_1:layer_2:layer_3:nginx-configs-repository"
)
一些解释; 'layers_*' 应该是目录,这些将是 在服务器环境中创建为格式:'layer_1/layer_2/layer_3'。我的计划 是使用layer_1作为隐藏目录意味着它们最多可以相等, layer_2 也可以相等,并将用作一个类别。但是,“layer_3”不是 总是需要的(例如数组的第一个值)。对于第一个条目 'layer_1:layer_2:server-deployment-repository' 我将使用它作为 '.hidden/setup' 因为我 希望能够从那里(重新)启动部署,并且 根据其格式,似乎没有理由使用第三层。
列表末尾从左到右的值显然是存储库名称并用作源。这不是像其他目录层那样的目录层,但它将用于根据特定路径查找存储库,并提供配置存储库内容和分层文件夹之间关系的功能。
我目前正在完成这项任务,但解决方案并不总是最干净的。通过该说明,我使用以下内容来实现这一点(主要不是根据上面的数组):
for collection in ${DEPLOYMENT_DIRECTORY_ASSIGNMENT[@]}; do
while IFS=':' read -r first_layer second_layer third_layer repository
do
first_layers+=($first_layer)
second_layers+=($second_layer)
third_layer+=($third_layer)
source_repositories+=($repository)
u_layers=($(echo "${layers[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
done <<< "$collection"
done
这至少在某种程度上是静态的,但是我将每个值添加到数组中并稍后执行几个 if-else 检查,以在将层创建为目录时保持所有内容的排序。对于彼此相等的层/文件夹,我使用选项对唯一字符进行排序以防止重复问题。
但由于从那时起这是静态的,我想弄清楚以下几点:
当层数不同时,我可以使用“while IFS=':' read -r”的组合来支持动态循环遍历除以':'的值的选项吗?
如:
"layer_1:layer_2:repository"
"layer_1:layer_2:layer_3:repository"
"layer_1:layer_2:layer_3:layer_4:layer_5:layer_6:repository"
"layer_1:layer_2:layer_3:layer_4:layer_5:repository"
我知道 Bash 并不总是最合乎逻辑的选择,但是当我开始这些项目时,我想挑战自己并更多地了解这种语言。
但是什么是最好的解决方案呢?
【问题讨论】:
-
Mucho texto。你不能简单地描述一下你到底想要什么,并提供一个minimal reproducible example吗?
-
Lo siento。我可以写更长的,但我确实更喜欢短。并且喜欢提供一些信息作为背景故事来回答可能的常见问题。不过感谢您的反馈。
-
与其试图预测所有可能的问题,更好的(和推荐的)策略是使问题简短而切题,只包含传达问题所需的内容,仅此而已。不需要背景故事,事实上,它会分散注意力。
标签: linux bash loops deployment logic