如何编写一个包含脚本内容的脚本,脚本内容取决于变量的值?

时间:2019-03-02 01:25:47

标签: bash shell base64

简介:

我正在寻找最好的方法来创建文件,该文件包括一个脚本,其中包含没有依赖性的所有内容(无需从外部源下载内容)。 可以与EC2实例/模板中的userdata功能一起使用。

问题:

根据脚本中定义的变量创建文件以添加systemctl服务。 (在这里:$REPOSITORYLINK

我的服务文件:

[Unit]
Description=pblv
After=docker.service

[Service]
Type=simple
ExecStart=/usr/bin/docker run -d --rm -p 80:9090 $REPOSITORYLINK:latest

[Install]
WantedBy=multi-user.target

为了能够使用这些行来创建新文件,我想到了将它们转换为base64的想法。

#!/bin/bash
export REPOSITORYLINK=thelink.repo.com #Defining the parameter
echo ICAgIFtVbml0XQogICAgRGVzY3JpcHRpb249cGJsdgogICAgQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKICAgIAogICAgW1NlcnZpY2VdCiAgICBUeXBlPXNpbXBsZQogICAgRXhlY1N0YXJ0PS91c3IvYmluL2RvY2tlciBydW4gLWQgLS1ybSAtcCA4MDo5MDkwICRSRVBPU0lUT1JZTElOSzpsYXRlc3QKICAgIAogICAgW0luc3RhbGxdCiAgICBXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldA== | base64 --decode > /etc/systemd/system/myservice.service

如预期的那样,这将照原样复制base64解码的字符串,而不替换$REPOSITORYLINK的值。

这只是一个例子,我知道我可以使用Docker --restart always就可以做到这一点,而无需为此创建服务,但这不是问题。

我正在寻找一种更简单的方法,而无需添加hacky代码。

解决方案的一部分:

cat > /etc/systemd/system/myservice.service <<ENDOFCONTENT
    [Unit]
    Description=pblv
    After=docker.service

    [Service]
    Type=simple
    ExecStart=/usr/bin/docker run -d --rm -p 80:9090 $REPOSITORYLINK:latest

    [Install]
    WantedBy=multi-user.target
ENDOFCONTENT

这是可行的,但是我想要更通用的东西,如果我的文件包含ENDOFCONTENT ...

如何将解决方案与base64哈希结合在一起?

编辑:我不想添加任何搜索并替换变量值的循环。我需要内部解决方案。

0 个答案:

没有答案