我正在尝试用 sed 替换文件中的一些字符串,但出现一个奇怪的错误。
这是脚本...
#!/bin/bash
TEMPLATE=/etc/nginx/site-template
if [ -f $TEMPLATE ]; then
echo -n
else
echo "Template $TEMPLATE not found."
exit
fi
function usagehelp {
echo "Usage: DOMAIN SITEDIR"
echo "Example: createsite.sh test.com /var/www/sites/site"
}
if [ -z $1 ]; then
usagehelp
exit
fi
if [ -z $2 ]; then
usagehelp
exit
fi
SDOMAIN=$1
SDIR=$2
if [ -f /etc/nginx/sites-enabled/$SDOMAIN ]; then
echo "Site already exists!"
exit
fi
SCONFIG=/etc/nginx/sites-enabled/$SDOMAIN
cp $TEMPLATE $SCONFIG
sed -i -e "s/%DOMAIN%/$SDOMAIN/g" $SCONFIG
sed -i -e "s/%SITEDIR%/$SDIR/g" $SCONFIG
mkdir $SDIR
chown john:www-data $SDIR
chmod a-rwx,u+rwx,g+rx $SDIR
if nginx -t; then
nginx -s reload
echo "nginx reloaded with new site"
fi
运行它会产生以下输出,我不太确定为什么。我真的需要一双额外的眼睛...
sed: -e expression #1, char 14: unknown option to `s'
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx reloaded with new site
在 %SITEDIR%
的情况下,如果您的$SDIR
包含目录名称,则名称中的第一个/
将被视为 s///
命令的结尾,而不是数据。
糟糕的答案是尝试选择一个不太可能在文件名中的符号 - 例如,如果您不希望@
符号在文件名中,请使用:
sed -i -e "s@%SITEDIR%@$SDIR@g"
好的答案是使用完全不同的工具——awk、perl等。有一个 awk 脚本可以在 BashFAQ #21 中安全地执行此操作。