2012-08-02 129 views
0

以下腳本顯示「文件意外結束」錯誤。我不知道爲什麼我面臨這個錯誤。我的所有報價都正確關閉。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 
+0

這更像是一個「請修復這個腳本中的錯誤」的問題(或者真的,在這種情況下,「請指出我的猜測和實際的shell語法之間的差異」)比單個具體問題。有一個Code Review StackExchange網站可能更適合。 – 2012-08-02 21:12:00

回答

3

該錯誤是由< <造成的。當遇到這種情況時,腳本會嘗試讀取,直到找到一條確實(從第一列開始)在<之後發現的行。由於這是從未發現,腳本搜索到最後,然後抱怨文件意外結束。

但這不是你唯一的問題。我看到至少有以下其他問題:

  • 您只能使用$ 1到$ 9的位置參數。如果你想超越這個範圍,則需要使用shift命令,或者,如果你的shell的版本支持它,則在變量名稱周圍使用大括號;例如$ {10},$ {11} ...
  • 變量賦值不能有空格等號
  • 要調用insertsql,您不能使用(和);你會這樣定義一個新的函數。
  • 您的insertsql函數的cass必須通過參數空格分隔,而不是逗號分隔。
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元字符,這意味着完全不同的東西。例如,<<是輸入重定向,而[]用於文件名匹配。

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 ...

+0

該死的......糾正了除換擋操作員之外的所有事情...你能解釋我是如何換擋24還是再乘以2^24? – riship89 2012-08-02 20:51:00

+0

你可以使用'bc'或'expr'。用'bc',你可以做'echo'2^24「| bc'。用'expr'你需要自己計算功率,只做簡單的算術,如乘法和加法。 – perreal 2012-08-02 20:54:01

+0

啊。與bc廝殺...你能告訴我如何轉換10.1.1.10到10 *(256 ** 3)+ 1 *(256 ** 2)+ 1 *(256 ** 1)+ 10 – riship89 2012-08-02 21:56:56

1

那是因爲你不遵守shell語法。 對於ser變量,您不允許使用圍繞=的空格,並且連接兩個字符串部分不應使用+。因此字符串

src_ip = "10.1.2."+$i 

爲什麼你正在使用的字符串

src_ip_octets = ${src_ip//,/} 

我不知道成爲

src_ip="10.1.2.$i" 

。你變量中絕對沒有逗號。因此,即使刪除所有逗號它應該看起來像(最後/的情況下,不需要你只是刪除符號):

src_ip_octets=${src_ip//,} 

下一個字符串有很多,在以自己的方式外殼intepreter符號和這就是爲什麼你會得到有關文件的(特別是由於定界符<<

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##*.})) 

相同的東西與下一個字符串。

+0

謝謝修正了字符串拆分部分 – riship89 2012-08-02 20:54:18

相關問題