2012-08-02 10 views
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 
+0

이것은 하나의 특정 문제보다 "이 스크립트의 버그를 수정하십시오"라는 질문 (또는 실제로는 "내 추측과 실제 셸 구문의 차이점을 지적하십시오")에 더 가깝습니다. 더 적합한 코드 검토 StackExchange 사이트가 있습니다. –

답변

3

해당 오류는 < <으로 인해 발생합니다. 이 문제가 발생하면 스크립트는 정확히 첫 번째 열에서 시작하여 < < 뒤에 오는 줄을 찾을 때까지 읽으려고합니다. 검색된 적이 없기 때문에 스크립트는 끝까지 검색 한 다음 파일이 예기치 않게 종료되었다고 불평합니다.

하지만 그게 유일한 문제는 아닙니다. 적어도 다음과 같은 다른 문제가 있습니다.

  • 위치 매개 변수는 $ 1에서 $ 9까지만 사용할 수 있습니다. 그 이상으로 이동하려면 shift 명령을 사용해야합니다. 또는 쉘 버전에서 지원하는 경우 변수 이름 주위에 중괄호를 사용하십시오. 예 : $ {10}, $ {11} ...
  • 변수 할당에 공백이 없어야합니다. 등호
  • insertsql을 호출하려면 (and)를 사용하면 안됩니다. 당신은 그런 식으로 새로운 기능을 정의 할 것입니다.
  • 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] 

쉘은 수학을하지 않습니다. 이것은 C가 아닙니다. 이러한 종류의 계산을 수행하려면 bc, dc 또는 여기에서 시도하는 일종의 수학을 수행 할 수있는 다른 도구를 사용해야합니다.

대부분의 연산자는 실제로 완전히 다른 것을 의미하는 쉘 메타 문자입니다. 예를 들어, <<은 입력 리디렉션이고 []은 파일 이름 globbing에 사용됩니다.

1

문제의 몇 : dst_ip="10.1.1.$i"

  • 문자열 연결은 더하기 기호를 사용하여 수행되지 않고, : 예 :

    • 등호 및 할당의 양측 사이에는 공백이 없어야합니다 예 : dst_ip="10.1.1.$i"

    • bash에는 시프트 연산자가없고 << : $dst_ip_octets[0]*1<<24은 0으로 수행 할 수 있습니다. 12,`

    • 함수는 인수가 공백없이 괄호로 구분됩니다, 단지 쉘 스크립트처럼라고 : 당신은 쉘 구문을 따르지 않기 때문이다 insertsql 1 10000 ...

  • +0

    젠장 ... 시프트 연산자를 제외한 모든 것을 수정했습니다 ... 24 시프트 또는 2^24로 다시 곱하는 방법을 설명 할 수 있습니까? – riship89

    +0

    당신은'bc' 또는'expr'을 사용할 수 있습니다. 'bc'를 사용하면'echo "2^24"| bc'. 'expr'을 사용하면 스스로 힘을 계산할 필요가 있으며 곱셈과 덧셈과 같은 단순한 산술 만 수행하면됩니다. – perreal

    +0

    아. 당신은 10.1.1.10을 10 * (256 ** 3) + 1 * (256 ** 2) + 1 * (256 ** 1) + 10 – riship89

    1

    합니다. ser 변수에 = 주위에 공백을 사용하고 문자열의 두 부분을 연결하는 것은 허용되지 않으므로 +을 사용하면 안됩니다.당신은 내가 모르는 문자열

    src_ip_octets = ${src_ip//,/} 
    

    를 사용하는 이유는 그래서 문자열

    src_ip = "10.1.2."+$i 
    

    src_ip="10.1.2.$i" 
    

    을하게된다. 변수에는 쉼표가 전혀 없습니다. 그래서도 (경우에 필요하지 않은 마지막 / 그냥 삭제하는 문자)가 같아야합니다 모든 쉼표 삭제하려면 다음 문자열이 자신의 방법에 intepreter 쉘의 심볼을 많이 가지고

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

    동일한 문자열은 다음 문자열과 같습니다.

    +0

    으로 어떻게 고쳐 주는지 고칠 수 있습니까? 문자열 분할 부분 – riship89

    관련 문제