0
cd /etc/squid/
SQUID=/etc/squid/squid.conf
WORD="acl blockclients src 192.168.5.0/255.255.255.0"
WORD1="acl banned src "/etc/squid/our_512kbps.txt""
WORD2="http_access deny banned"
WORD3="http_reply_access deny banned"
WORD4="http_access allow blockclients"
WORD5="http_reply_access allow all"

sed -i "s/LINE1/&\n$WORD/" $SQUID
sed -i "s/LINE2/&\n$WORD1/" $SQUID
sed -i "s/LINE3/&\n$WORD2/" $SQUID
sed -i "s/LINE4/&\n$WORD3/" $SQUID
sed -i "s/LINE5/&\n$WORD4/" $SQUID
sed -i "s/LINE6/&\n$WORD5/" $SQUID

我是Shell编程新手,请任何人帮助我

我在这条线上遇到错误

WORD="acl blockclients src 192.168.5.0/255.255.255.0"

喜欢

./internetblock.sh: line 7: blockclients: command not found
sed: -e expression #1, char 30: unknown option to `s'
4

2 回答 2

1

问题是它WORD包含一个/也是sed表达式分隔符的。这就是sed引发错误的原因。解决此问题的最简单方法是使用文本中不存在的字符作为sed分隔符,例如|.

尝试将您的sed命令更改为使用|,而不是/

sed -i "s|LINE1|&\n$WORD|" $SQUID
于 2013-09-12T11:48:06.037 回答
0

使用sed参数扩展很棘手。鉴于您的问题的结构,迭代文件可能更合适:

cd /etc/squid/
SQUID=/etc/squid/squid.conf
WORD="acl blockclients src 192.168.5.0/255.255.255.0"
WORD1='acl banned src "/etc/squid/our_512kbps.txt"'   # Use single quotes for embedded double quotes
WORD2="http_access deny banned"
WORD3="http_reply_access deny banned"
WORD4="http_access allow blockclients"
WORD5="http_reply_access allow all"

{
     read LINE1
     printf "%s\n%s\n" "$LINE1" "$WORD"
     read LINE2
     printf "%s\n%s\n" "$LINE2" "$WORD1"
     read LINE3
     printf "%s\n%s\n" "$LINE3" "$WORD2"
     read LINE4
     printf "%s\n%s\n" "$LINE4" "$WORD3"
     read LINE5
     printf "%s\n%s\n" "$LINE5" "$WORD4"
     cat   # Any remaining lines from the input file
} < "$SQUID"

如果您正在使用bash或其他支持数组的 shell,则可以大大缩短:

cd /etc/squid/
SQUID=/etc/squid/squid.conf
WORDS=( "acl blockclients src 192.168.5.0/255.255.255.0"
        'acl banned src "/etc/squid/our_512kbps.txt"'
        "http_access deny banned"
        "http_reply_access deny banned"
        "http_access allow blockclients"
        "http_reply_access allow all" )

{ for word in "${WORDS[@]}"; do
      read LINE;
      printf "%s\n%s\n" "$LINE" "$word"
  done
  cat
} < "$SQUID"
于 2013-09-12T12:43:07.423 回答