2012-12-02 3 views
4

루프를 넣을 두 개의 배열이 있습니다. 루프를 만들기 전에 적절하게 구성합니다. 배열에 대해 모든 내용이 정상인지 확인합니다. 하지만 스크립트를 실행하면 오류가 출력 :구문 오류 : Bash를 사용할 때 예상되는 피연산자

l<=: syntax error: operand expected (error token is "<=" 

나는 거대한 구글을 상담하고 나는 그것이 두 번째 변수의 부족으로 고통을 이해하지만, 내가 값을 에코 할 앞서 언급 한 모든 것을 보인다을 괜찮을거야. 여기에 스 니펫이 있습니다.

#!/bin/bash 
    k=0 
    #this loop is just for being sure array is loaded 
    while [[ $k -le ${#hitEnd[@]} ]] 
     do 
     echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}" 
     # here outputs the values correct 
     k=$((k+1)) 
    done 
    k=0 
    for ((l=${hitStart[k]};l<=${hitEnd[k]};l++)) ; do //this is error line.. 
     let array[l]++  
     k=$((k+1)) 
done 

for 루프의 변수는 정확하게 에코되지만 루프는 작동하지 않습니다. 어디에서 잘못 되었습니까?

#

gniourf_gniourf 대답 같이 오류 출력을 의미

"... At some point, k will reach the value ${#hitEnd[@]}, and this is exactly when hitEnd[k] is not defined and expands to an empty string! Bang!"

루프의 시작 부분에 있지 표시되지만, k는 인덱스를 가리키고, 배열의 인덱스보다 더 큰 값을 가질 때 그 배열은 포함하지 않는다 ...

답변

4

어떤 점에서 ${hitEnd[k]}은 확장되지 않습니다 (정의되지 않음). ((l<=))과 같은 오류가 발생합니다. 당신은 당신의 for 루프를 작성해야 등 : 항상 배열 ${hitEnd[@]}에 정의 된 필드에 해당하는 인덱스 k을 갖도록

k=0 
for ((l=${hitStart[0]};k<${#hitEnd[@]} && l<=${hitEnd[k]};l++)); do 

.

또한, 대신

k=$((k+1)) 

당신은

((++k)) 

완료를 쓸 수 있습니다!

스크립트 더 나은 현대 bash는 연습을 사용하여 수정 :

#!/bin/bash 
k=0 
#this loop is just for being sure array is loaded 
while ((k<=${#hitEnd[@]})); do 
    echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}" 
    # here outputs the values correct 
    ((++k)) 
done 
k=0 
for ((l=hitStart[0];k<${#hitEnd[@]} && l<=hitEnd[k];++l)); do 
    ((++array[l])) 
    ((++k)) 
done 

지금, 나는 당신이 ... 대신이 말은하지 마십시오 할 무엇 for 루프가 정확히 않습니다 너무 확실하지 않다?

#!/bin/bash 
# define arrays hitStart[@] and hitEnd[@]... 
# define array array[@] 

#this loop is just for being sure array is loaded 
for ((k=0;k<${#hitEnd[@]};++k)); do 
    echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}" 
    # here outputs the values correct 
    ((++k)) 
done 

for ((k=0;k<${#hitEnd[@]};++k)); do 
    for ((l=hitStart[k];l<=hitEnd[k];++l)); do 
     ((++array[l])) 
    done 
done 
+0

덕분에 gniourf_gniourf, 시도 및 비트에 게시 할 예정입니다 .. – teutara

+0

은 아직도 명확하게 이해하지 않는다 왜 질문에 언급 된 상황이 효과가 없지만 당신의 노력에 감사드립니다. – teutara

+0

나는 그것을 이해할 것이라고 생각했습니다! 변수'k'가 항상 증가하는 것을 관찰하고'for' 루프 (즉,'<= hitEnd [k]'부분)의 테스트 부분이 각 패스에서 평가된다는 것을 기억하십시오! 물론 –

1

비트 미봉책-Y,하지만에 대한 루프 while 루프로 당신을 다시 작성 :

l="${hitStart[k]}" 
while [[ "$l" -le "${hitEnd[k]}" ]]; do 
     let array[l]++  
     k=$((k+1)) 
     l=$((l+1)) 
done 
+0

sampson-chen .. 감사합니다. 당신은 저에게 영감을주었습니다. – teutara

관련 문제