cat-重定向文件,但具有变量扩展

cat-重定向文件,但具有变量扩展

~/nginx_app我有包含此conf模板的文件:

server {
    root /var/www/html/${domain}/;
    server_name ${domain} www.${domain};
}

我也有这个脚本:

#!/bin/bash
domain="$1" && test -z ${domain} && return
cat ~/myAddons/nginx_app > /etc/sites-available/${domain}.conf

正如您所看到的,我希望将脚本根据模板创建的内容重定向nginx_app到。${domain}.conf

cat现在,需要在重定向发生时扩展模板内的变量。您如何保证扩张确实会发生?

我正在考虑here-string,但我知道它会打印一个字符串:

cat > "etc/nginx/sites-available/${domain}.conf" <<< "source ~/myAddons/nginx_app"

还有这个

cat ~/myAddons/nginx_app > etc/nginx/sites-available/${domain}.conf

更新

运行脚本后,最终状态应该/etc/sites-available/example.com.conf

server {
    root /var/www/html/example.com/;
    server_name example.com www.example.com;
}

答案1

您想要做的基本上是字符串替换来处理输入文件的内容,而不是变量扩展(尽管当您引用变量时,shell 会执行该操作,但这不是对输入内容的工作)。

这可以用 来完成sed,并且可以使用 shell 变量,尽管请参阅回答可能出现的问题。

#!/bin/sh
test -n "$1" || exit 1
sed 's/\${domain}/'"$1"'/g' input.txt > output_"$1".txt

input并进行相应调整output。另请注意,我$1直接使用位置参数,而不是将其复制到变量。

如果我可以建议更好的方法是有一个充当模板的脚本,并且您只提供变量作为脚本命令行的位置参数或通过获取变量文件以其他方式提供。复制文件并通过替换字符串来执行杂技,特别是当模式变得复杂时,并不是最好的方法。

答案2

我所做的工作(根据 StephenHarris 评论编辑)是:

domain=aa ; sed s"/\$domain/$domain/" ~/nginx_app >> ${domain}.conf

$domainsed 命令的第二个扩展到aa我的测试用例中。然而,由于第一个$domain$标识符已转义,因此它不会被扩展。

还有另一个名为 的命令行程序,awk它有一种更强大的方式将变量从外部传递到内部,但sed被认为更快、更高效(不确定现在是否真的如此),所以这就是我回答的原因,sed因为这是一个简单的情况。在 中awk,您可以使用:

awk -v domain=aa '{gsub("\\$domain",domain);print}' ~/nginx_app >> ${domain}.conf

这里,-v选项awk定义了一个awk变量,并且gsub是一个awk用于对给定行执行全局替换的函数。转义序列\\sed解决方案稍长。

相关内容