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

私はシェルプログラミングが初めてで、誰か助けてください

この行でエラーが発生しています

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

問題は、式の区切り文字でもあるWORDa が含まれていることです。そのため、エラーがスローされます。これを修正する最も簡単な方法は、テキストに存在しない文字をセパレーターとして使用することです。/sedsedsed|

の代わりに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、大幅に短縮できます。

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 に答える