以下脚本显示“意外的文件结束”错误。我不知道为什么我会遇到这个错误。我的所有报价都已正确关闭。
#!/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
答案 0 :(得分:3)
该错误是由&lt;&lt;。遇到这种情况时,脚本会尝试读取,直到找到一条完全(从第一列开始)在&lt;&lt;&lt;。之后找到的行。由于从未找到,脚本搜索到最后,然后抱怨文件意外结束。
然而,这不是你唯一的问题。我至少看到以下其他问题:
答案 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.如果你想进行这种计算,你需要使用bc
,dc
或其他一些可以做你正在尝试的数学运算的工具。这里。
这些运算符中的大多数实际上都是shell元字符,这意味着完全不同的东西。例如,<<
是输入重定向,[
和]
用于文件名通配。