shell脚本中的错误:意外的文件结束

时间:2012-08-02 20:12:53

标签: shell

以下脚本显示“意外的文件结束”错误。我不知道为什么我会遇到这个错误。我的所有报价都已正确关闭。

#!/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 个答案:

答案 0 :(得分:3)

该错误是由&lt;&lt;。遇到这种情况时,脚本会尝试读取,直到找到一条完全(从第一列开始)在&lt;&lt;&lt;。之后找到的行。由于从未找到,脚本搜索到最后,然后抱怨文件意外结束。

然而,这不是你唯一的问题。我至少看到以下其他问题:

  • 您只能使用1美元到9美元的位置参数。如果你想超越它,则需要使用shift命令,或者,如果你的shell版本支持它,请在变量名周围使用大括号;例如$ {10},$ {11} ...
  • 变量赋值不得具有等号
  • 的空格
  • 要调用您的insertsql,您不能使用(和);你可以用这种方式定义一个新功能。
  • 您的insertsql函数的cass必须传递空格分隔的参数,而不是逗号分隔。

答案 1 :(得分: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 ...

答案 2 :(得分: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##*.} ))

下一个字符串也是如此。

答案 3 :(得分: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元字符,这意味着完全不同的东西。例如,<<是输入重定向,[]用于文件名通配。