sed在bash脚本中没有按预期工作

时间:2014-02-17 22:09:22

标签: bash sed

我试图用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

1 个答案:

答案 0 :(得分:4)

对于%SITEDIR%,如果您的$SDIR包含目录名,则名称中的第一个/将被视为s///命令的结尾而不是作为数据。

错误的答案是尝试选择一个不太可能在文件名中的符号 - 例如,如果您不希望@符号位于文件名中,请使用:

sed -i -e "s@%SITEDIR%@$SDIR@g"

好的答案是使用完全不同的工具 - awk,perl等。有一个awk脚本可以在BashFAQ #21中安全地执行此操作。