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 命令,或者,如果你的 shell 版本支持它,在变量名周围使用大括号;例如 ${10}、${11}...
  • 变量赋值不能在等号周围有空格
  • 要调用您的 insertsql,您不能使用 ( and ); 你会这样定义一个新函数。
  • insertsql 函数的 cass 必须传递以空格分隔的参数,而不是逗号分隔的参数。
于 2012-08-02T20:45:55.547 回答
1

那是因为你不遵循 shell 语法。对于 ser 变量,您不允许使用空格=并连接您不应该使用的字符串的两个部分+。所以字符串

src_ip = "10.1.2."+$i

变得

src_ip="10.1.2.$i"

为什么你使用字符串

src_ip_octets = ${src_ip//,/}

我不知道。你的变量中绝对没有逗号。因此,即使要删除所有逗号,它也应该看起来像(/如果您只是删除符号,则不需要最后一个):

    src_ip_octets=${src_ip//,}

下一个字符串有很多符号可以以自己的方式进行 shell 解释,这就是为什么您会收到有关文件意外结束的错误(尤其是由于 heredoc <<

    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 回答
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`

  • 函数的调用就像 shell 脚本一样,参数用空格分隔,没有括号:insertsql 1 10000 ...

于 2012-08-02T20:46:29.250 回答
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]

shell 不做数学运算。这不是 C。如果你想进行这种计算,你需要使用类似的东西bcdc或者其他一些可以做你在这里尝试的数学的工具。

这些运算符中的大多数实际上是 shell 元字符,它们的含义完全不同。例如,<<是输入重定向,并且[用于]文件名通配符。

于 2012-08-02T20:45:35.333 回答