我编写脚本以在我的开发计算机上创建Web主机。 它必须为主机创建目录并更改nginx配置文件。 当我尝试使用双引号添加字符串配置文件时生成错误:
#!/bin/sh
webdir="/var/chroot/www"
destdir="${webdir}/$1"
nginxconfig="/usr/local/etc/nginx/nginx.conf"
sed "/hostsection/ a\
\
server {\
listen 80;\
server_name $1 www.$1;\
root ${destdir}/www;\
include /usr/local/etc/nginx/yii-rewrite.conf;\
access_log ${destdir}/access_log main;\
error_log ${destdir}/error_log error;\
}\
\
" ${nginxconfig}
错误如下所示:
sed: 1: "/hostsection/ a server ...": command a expects \ followed by text
如果我尝试使用单引号
....
sed '/hostsection/ a\
...
' ${nginxconfig}
sed工作正常,但它不会在开始每个字符串时替换字符串中的变量和修剪空格:
# hostsection
server {
listen 80;
server_name $1 www.$1;
root ${destdir}/www;
include /usr/local/etc/nginx/yii-rewrite.conf;
access_log ${destdir}/access_log main;
error_log ${destdir}/error_log error;
error_page 413 /413.html;
}
如何更正我的脚本以消除双引号中的sed错误?
如何在开始字符串上添加空格?
答案 0 :(得分:2)
反斜杠将escape换行符,因此sed将其全部视为一条长行。
在行尾使用双反斜杠以避免这种情况。然后,您可以使用单个反斜杠来转义前导空格。
sed "/hostsection/ a\\
\\
\ server {\\
\ listen 80;\\
\ server_name $1 www.$1;\\
...
答案 1 :(得分:0)
取自https://www.freebsd.org/cgi/man.cgi?query=sed
Multibyte characters containing a byte with value 0x5C (ASCII `\') may be
incorrectly treated as line continuation characters in arguments to the
``a'', ``c'' and ``i'' commands. Multibyte characters cannot be used as
delimiters with the ``s'' and ``y'' commands.
你引用你的sed命令,以便shell可以替换变量,但是bash之类的shell会将“\”解释为行尾处的行继续符。
可能的解决方案
在每行末尾使用\\
代替\
。这种方式bash会解释字面反斜杠,sed会将字面反斜杠理解为换行符。