替换模板文件中的 bash 变量

2023-12-01

我正在尝试使用 Bash 来运行某种形式的安装过程。在此过程中,将复制配置文件并替换其中的某些值。这样的配置可以在下面找到:

server {
    listen 80;
    root ${INSTALLPATH};
    server_name ${SITEURL};

    client_max_body_size 20m;
    client_body_timeout 120s;

    location / {
        try_files /public/router.php =404;
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_pass ${PHPSERV};
        fastcgi_index router.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }

    location /assets {
        try_files /app/$uri =404;
    }

}

#Enables HTTPS access
#This requires you to install certificates and is not enabled by default
#If you wish to enable HTTPS, uncomment (remove the #s) from the below lines
#And change the ssl_certificate and ssl_certificate_key to point to the     correct
#certificates.

#server {
#    listen 443;
#    root ${INSTALLPATH};
#    server_name ${SITEURL};
#
#    ssl on;
#    ssl_certificate     /etc/nginx/ssl/site.crt;
#    ssl_certificate_key /etc/nginx/ssl/site.key;
#
#    location / {
#        try_files /public/router.php =404;
#        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
#        fastcgi_pass ${PHPSERV};
#        fastcgi_index router.php;
#        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#        include /etc/nginx/fastcgi_params;
#    }
#
#    location /assets {
#        try_files /app/$uri =404;
#    }
#
#}

我发现大多数示例都源于 eval 的使用,并且我尝试使用它来进行此替换,但是似乎此处的文件未正确扩展,并且 bash 尝试执行一些内容但无法执行。

目前,我有这个

INSTALLPATH="/var/www/html/mycustomsite/"
PHPSERV="127.0.0.1:9000"
SITEURL="example.com"

while read -r line; do
    eval echo -e "${line}"
done < template

但是,这不能正确替换声明的值,也不能正确生成文件。例如,它会丢失以 # 开头的任何行并尝试执行其他行(同时丢失一些空格)。

仅使用 Bash 和大多数 Linux 系统上可用的命令来执行此操作的正确方法是什么?


安全提示

这个不用照顾安全问题! Using eval is evil!

The 兼容的答案是不是更好了!

当然,您必须对模板的内容充满信心!

如果没有,请尝试使用sed! (见我最后的回答)

快捷方式bash only!:

Under bash你可以简单地:

eval "INSTALLPATH='/somepath/somewhere' SITEURL='example.com' PHPSERV='127.0.0.1:9000'; echo \"$(<template)\""

or

eval "INSTALLPATH='/somepath/somewhere'
    SITEURL='example.com'
    PHPSERV='127.0.0.1:9000';
    echo \"$(<template)\""

当你使用eval,您可以将生成的配置文件存储到一个变量中:

eval "INSTALLPATH='/somepath/somewhere'
    SITEURL='example.com'
    PHPSERV='127.0.0.1:9000';
    cfgBody=\"$(<template)\""

Then

echo "$cfgBody"

and/or

echo "$cfgBody" >/cfgpath/cfgfile

循环执行此操作

tmplBody="$(<template)"
while read INSTALLPATH SITEURL PHPSERV CFGFILE;do
    [ "$CFGFILE" ] && eval "echo \"$tmplBody\"" >"$CFGFILE"
  done <<<"
    /somepath/somewhere            example.com  127.0.0.1:9000  /tmp/file1
    '/some\ other\ path/elsewhere' sample2.com  127.0.0.1:9001  /tmp/file2
"

Note:第二行有escaped空格(前面带有反斜杠\ and quotes '. The 反斜杠 tell read为了不拆分变量,并且必须将引号添加到结果中/tmp/file2.

软方式(兼容答案)

Under posix shell,你可以这样做:

#!/bin/sh

(
    cat <<eohead
    #!/bin/sh
    INSTALLPATH='/somepath/somewhere'
    SITEURL='example.com'
    PHPSERV='127.0.0.1:9000';
    cat <<eof
eohead
    cat template
    echo eof
) | /bin/sh

这不需要bash,已经过测试dash and busybox.

bash没有eval !

sedcmd=''
for var in INSTALLPATH SITEURL PHPSERV;do
    printf -v sc 's/${%s}/%s/;' $var "${!var//\//\\/}"
    sedcmd+="$sc"
  done
sed -e "$sedcmd" <template

可以进入循环:

while read INSTALLPATH SITEURL PHPSERV CFGFILE;do
    if  [ "$CFGFILE" ] ;then
        sedcmd=''
        for var in INSTALLPATH SITEURL PHPSERV;do
            printf -v sc 's/${%s}/%s/;' $var "${!var//\//\\/}"
            sedcmd+="$sc"
          done
        sed -e "$sedcmd" <template >"$CFGFILE"
      fi
  done <<<"
    /somepath/somewhere             example.com  127.0.0.1:9000  /tmp/file1
    '/some\ other\ path/elsewhere'  sample2.com  127.0.0.1:9001  /tmp/file2
"

兼容的答案,使用sed

这可以在没有所谓的情况下工作bashisms,进入循环:

#!/bin/sh

while read INSTALLPATH SITEURL PHPSERV CFGFILE;do

    sedcmd="s|\\\${INSTALLPATH}|${INSTALLPATH}|;"
    sedcmd="${sedcmd}s|\\\${SITEURL}|${SITEURL}|;"
    sedcmd="${sedcmd}s|\\\${PHPSERV}|${PHPSERV}|;"

    sed -e "$sedcmd" template >"$CFGFILE"

  done <<eof
    /somepath/somewhere             example.com  127.0.0.1:9000  /tmp/file1
    '/some\ other\ path/elsewhere'  sample2.com  127.0.0.1:9001  /tmp/file2
eof

比较输出:

diff -u99 /tmp/file{1,2}
--- /tmp/file1        2015-05-31 11:02:03.407463963 +0200
+++ /tmp/file2        2015-05-31 11:02:03.407463963 +0200
@@ -1,22 +1,22 @@
 server {
     listen 80;
-    root /somepath/somewhere;
-    server_name example.com;
+    root '/some other path/elsewhere';
+    server_name sample2.com;

     client_max_body_size 20m;
     client_body_timeout 120s;

     location / {
         try_files /public/router.php =404;
         fastcgi_split_path_info ^(.+?\.php)(/.*)$;
-        fastcgi_pass 127.0.0.1:9000;
+        fastcgi_pass 127.0.0.1:9001;
         fastcgi_index router.php;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         include /etc/nginx/fastcgi_params;
     }

     location /assets {
         try_files /app/$uri =404;
     }

 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换模板文件中的 bash 变量 的相关文章

  • 向后台进程发送命令

    我有一个先前运行的进程 process1 sh 它正在后台运行 PID 为 1111 或其他任意数字 我怎样才能发送类似的东西command option1 option2PID 为 1111 的进程 I don t想要启动一个新的proc
  • 从 shell 查找不包含特定注释的 XML 文件

    我想搜索 awk grep sed 几个 XML 文件 pom xml 文件 跳过某些文件夹 而且 第一个条件是它们必须包含标签
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • awk 脚本中出现“BEGIN 块必须有操作部分”错误

    这是我的代码 bin sh filename usr bin find name INSTANCE log echo filename is filename awk BEGIN print Processing file filename
  • 检查 bash 中是否存在关联数组元素

    在 bash 脚本中 我在变量中有一个区域设置 如下所示 locale fr ma 我也有一个像这样的关联数组 declare A new loc map new loc fr ma en ma new loc el gr en gr ne
  • Bash 中所有匹配的^单词^替换^?

    为了澄清 我正在寻找一种方法来执行global搜索并替换先前使用的命令 word replacement 似乎只替换了第一场比赛 有没有一些set我无法选择的选项 尝试这个 echo oneone oneone gs one two Rep
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 关键字“if”如何测试一个值是真还是假?

    在 bash 脚本中 if 1 then echo Yes else echo No fi Output Yes 它表示 1 被视为真值 但在代码中 word Linux letter nuxi if echo word grep q le
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • 批量删除文件名中包含 BASH 中特殊字符的子字符串

    我的目录中有一个文件列表 opencv calib3d so2410 so opencv contrib so2410 so opencv core so2410 so opencv features2d so2410 so opencv
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 如何制作 Bash 脚本来查找项目中未使用的图像?

    如何制作一个 Bash shell 脚本 它可以识别所有 jpg gif 和 png 文件 然后识别文件夹中任何文本文件中哪些文件未通过 url href 或 src 链接 这就是我开始的 但我最终得到了与我想要的相反的结果 我不想知道引用

随机推荐

  • Spring Data Neo4J 存储库 findAll() 导致 nullpointerException

    我制作了一个简单的存储库 其中包含系统中的所有人员 一切似乎都工作正常 我可以根据给定的键和值添加 删除甚至检索单个人员 但由于某种原因我无法直接检索存储在存储库中的所有人员 我尝试使用 findAll 方法来完成此操作 该方法应该返回一个
  • IIS不使用用户环境变量

    我将 NET Core 应用程序部署到同一服务器两次 一次用于 QA 一次用于生产 目前 我让他们每个人都使用不同的本地用户来运行 IIS 应用程序池 并相应地将 ASPNETCORE ENVIRONMENT 变量设置为 qa 和 生产 这
  • java.lang.OutOfMemoryError:调用 Files.readAllBytes 时直接缓冲内存

    我有以下代码 旨在读取目录并将其压缩到 tar gz 存档中 当我将代码部署到服务器上并使用一批文件对其进行测试时 它在前几个测试批次中工作 但在第 4 或第 5 批次之后 它开始持续给出 java lang OutOfMemoryErro
  • 从数组中删除负数

    我有一个来自数据库的数组 它从一组元素中获取所有 id 然而 它似乎也从发生的一些后端事件中获取了一些负 ID 并且它破坏了我需要对这些 id 执行的操作 在循环数组并将其放入应用程序之前 有没有办法从数组中删除这些负 ID 在我抓住它们之
  • 使用 AVFoundation 框架 iPhone 进行视频录制?

    我正在借助示例代码开发一个应用程序2010 年全球开发者大会AVCamDemo 示例 在应用程序中 我需要从 iPhone 的前置摄像头录制视频 但由于我的地方没有新的 iPhone 4 我无法正确测试代码 如果有人能给我提示 无论我是否朝
  • 我在 pyqt5 程序中使用 QDoubleValidator 但它似乎不起作用

    我创建了一个 QWidget 对象 其中有一些 lineEdit 并且我打算向它们添加一些约束 因此我实现了 QDoubleValidator 对象 以下是我的代码中的相关部分 self lineEdit taxRate QLineEdit
  • Python 和 Selenium - 离开页面时禁用警报

    Using Python 3 and Chrome驱动程序 假设一个自动化的 Python 程序正在网上冲浪 从不同的来源获取内容 假设这些网站中的任何一个触发了 您确定要离开此页面吗 alert 关键词 any 以随机方式 这些网站 Qu
  • 结构化数据(微观数据)和嵌入项目

    我想使用 Microdata 和 Schema org 来定义我的网页的主要内容 所以我做了这样的事情 div div div div
  • 将字符串从 C# 编组到 C++

    我是微软世界的新人 我在尝试将简单的字符串从 c 传递到 dll c 时遇到很多问题 我读过很多帖子和文档 但问题是一样的 C code extern C declspec dllexport int Init long l char ur
  • 宏中的 # 和 ##

    include
  • 如何更改 UITableView Swift 3 中的分隔符高度?

    尽管关于这个主题已经有一些答案 它们都没有涵盖 Swift 3 而且它们都是很久以前的了 当前在 Swift 3 中更改 UITableView 中分隔符高度的最佳方法是什么 更新为 Swift 3 如果您想更改 UITableView 分
  • 如何在链接悬停时隐藏浏览器左下角的 url

    当我将光标悬停在链接上时 我想隐藏显示的网址 我只想在我的浏览器上这样做 网上有很多关于此的问题 但我没有找到任何可行的解决方案 我正在寻找适用于 Chrome 或 Firefox 的解决方案 为什么我需要这样做 我很快就会展示一个网站演示
  • jQuery 如果在页面上找到此图像,请添加此元标记?

    我正在尝试将丰富的片段添加到显示星星的动态图像中 我的购物车写的唯一内容就是这个图像 所以我必须找到正在显示的图像 然后添加正确的元标记 因此 如果显示的图像是 1stars gif 我必须写 如果显示的图像是 5stars gif 我必须
  • 如何按列删除所有具有“NA”值的单元格

    这个问题不是重复的 因为我的data frame 没有相同数量的NA values在所有列中 因此该问题中提到的解决方案不起作用 我有一个data frame与很多NA值 我想删除所有具有 NA 值的单元格 重要 不是行或列 单元格 原来的
  • 如何将 URI 传递给意图?

    我正在尝试将 URI 对象传递给我的 Intent 以便使用该 URI 在另一项活动中 如何传递 URI private Uri imageUri Intent intent new Intent this GoogleActivity c
  • GPS计算Windows Phone 7上两点之间的距离

    我正在使用 GPS 来计算两点之间的距离 即我使用 Windows Phone 作为卷尺 但当我开始时 我实际上没有得到正确的值 即使我站着不动 它也给了我数百米 这是我的代码 myWatcher StatusChanged new Eve
  • 响应多个KeyDown事件

    我正在制作一个简单的 WinForm 赛车游戏 我有两个对象 汽车 当按下按键时它们在表单上移动 Form1KeyDown Event 唯一的问题是 当一个玩家按下一个键时 另一个玩家无法按下他的键 什么也不会发生 但是当第一个玩家释放钥匙
  • 嵌套的 RecyclerView 不滚动

    我在另一个回收器视图中添加回收器视图时遇到问题 子回收器位于 CardView 内 而 CardView 位于父回收器视图内 我尝试了互联网上的所有解决方案 但没有用 我希望子回收器视图垂直滚动 而父回收器视图也垂直滚动 父级回收者视图
  • 在 PL/SQL 过程中,将查询或引用游标包装在 HTML 表中

    如果您使用 SQL Plus 来使用 这似乎很容易 SQL gt set markup html on 并在 SQL Plus 窗口中获得一些可爱的结果 我们有一个预言机工作 需要通宵运行 并向许多人发送结果电子邮件 我想将 sql 语句包
  • 替换模板文件中的 bash 变量

    我正在尝试使用 Bash 来运行某种形式的安装过程 在此过程中 将复制配置文件并替换其中的某些值 这样的配置可以在下面找到 server listen 80 root INSTALLPATH server name SITEURL clie