0

次のスクリプトは、「予期しないファイルの終わり」エラーを示しています。なぜこのエラーに直面しているのかわかりません。私のすべての引用符は適切に閉じられています。

#!/usr/bin/sh
insertsql(){
        #sqlite3 /mnt/rd/stats_flow_db.sqlite <<EOF
        echo "insert into flow values($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18)"
        #.quit
}

for i in {1..100}
do
        src_ip = "10.1.2."+$i
        echo $src_ip
        src_ip_octets = ${src_ip//,/}
        src_ip_int = $src_ip_octets[0]*1<<24+$src_ip_octets[1]*1<<16+$src_ip_octets[2]*1<<8+$src_ip_octets[3]

        dst_ip = "10.1.1."+$i
        dst_ip_octets = ${dst_ip//,/}
        dst_ip_int = $dst_ip_octets[0]*1<<24+$dst_ip_octets[1]*1<<16+$dst_ip_octets[2]*1<<8+$dst_ip_octets[3]

        insertsql(1, 10000, $dst_ip, 20000, $src_ip, "2012-08-02,12:30:25.0","2012-08-02,12:45:25.0",0,0,0,"flow_a010105_a010104_47173_5005_1_50183d19.rrd",0,12,$src_ip_int,$dst_ip_int,3,50000000,80000000)

done
4

4 に答える 4

3

そのエラーは<<が原因です。これに遭遇すると、スクリプトは、<<の後に見つかったものを正確に(最初の列から)含む行が見つかるまで読み込もうとします。それが見つからないため、スクリプトは最後まで検索し、ファイルが予期せず終了したと文句を言います。

ただし、それだけが問題になるわけではありません。少なくとも次のような他の問題があります。

  • 位置パラメータには$1から$9しか使用できません。それを超えたい場合は、shiftコマンドを使用する必要があります。または、シェルのバージョンがそれをサポートしている場合は、変数名を中かっこで囲みます。例:$ {10}、$ {11} .. ..
  • 変数の割り当てには、等号の周りに空白を入れてはなりません
  • insertsqlを呼び出すには、(および)を使用しないでください。そのように新しい関数を定義します。
  • insertsql関数へのcassは、コンマ区切りではなく、空白で区切られたパラメーターを渡す必要があります。
于 2012-08-02T20:45:55.547 に答える
1

いくつかの問題:

  • 等号と割り当ての両側の間にスペースがあってはなりません。例: dst_ip="10.1.1.$i"

  • 文字列の連結は、プラス記号を使用して行われません。 dst_ip="10.1.1.$i"

  • bashにはシフト演算子はありません<<。:は`$dst_ip_octets[0]*1<<24で実行できます。expr $dst_ip_octets[0] * 16777216

  • 関数はシェルスクリプトと同じように呼び出され、引数はスペースで区切られ、括弧はありません。insertsql 1 10000 ...

于 2012-08-02T20:46:29.250 に答える
1

これは、シェル構文に従わないためです。変数を提供するために、周囲=にスペースを使用したり、使用してはならない文字列の2つの部分を連結したりすることは許可されていません+。だから文字列

src_ip = "10.1.2."+$i

なる

src_ip="10.1.2.$i"

文字列を使用する理由

src_ip_octets = ${src_ip//,/}

知らない。変数にはコンマはまったくありません。したがって、すべてのコンマを削除する場合でも、次のようになります(/シンボルを削除するだけの場合は、最後のコンマは必要ありません)。

    src_ip_octets=${src_ip//,}

次の文字列には、シェルが独自の方法で解釈する多くの記号が含まれているため、ファイルの予期しない終了に関するエラーが発生します(特にヒアドキュメントが原因<<) 。

    src_ip_int = $src_ip_octets[0]*1<<24+$src_ip_octets[1]*1<<16+$src_ip_octets[2]*1<<8+$src_ip_octets[3]

だから私はあなたが正確に何を意味したのか分かりませんが、私にはそれは次のようなものでなければならないようです

    src_ip_int=$(( ${src_ip_octets%%*.}+$(echo $src_ip_octets|sed 's/[0-9]\+\.\(\[0-9]\+\)\..*/\1/')+$(echo $src_ip_octets|sed 's/\([0-9]\+\.\)\{2\}\(\[0-9]\+\)\..*/\1/')+${src_ip_octets##*.} ))

同じことが次の文字列にも当てはまります。

于 2012-08-02T20:51:13.273 に答える
0

あなたはこれを行うことはできません:

        dst_ip_int = $dst_ip_octets[0]*1<<24+$dst_ip_octets[1]*1<<16+$dst_ip_octets[2]*1<<8+$dst_ip_octets[3]

シェルは数学を行いません。これはCではありません。この種の計算を実行する場合は、のようなものbcdcまたはここで試行している種類の計算を実行できる他のツールを使用する必要があります。

これらの演算子のほとんどは、実際にはまったく異なるものを意味するシェルメタ文字です。たとえば、<<は入力リダイレクトであり[]ファイル名のグロブに使用されます。

于 2012-08-02T20:45:35.333 に答える