2014-10-24 2 views
2

Z- 매트릭스 파일을 생성해야하는 zsh 스크립트가 있지만 한 번의 반복 후에 while 루프를 종료합니다. N과 M은 결코 증가하지 않습니다.zsh while 루프는 부동 소수점 산술을 사용하는 트리플 중첩 루프에서 조기에 종료합니다.

#!/bin/zsh 
n=0.5 
m=0.5 
a=60.0 
i=1 

while [[ $n -le 1.5 ]];do 
    while [[ $m -le 1.5 ]];do 
     while [[ $a -le 160 ]];do 
      echo $i 
      echo "o" > H2O.$i.Z 
      eval echo "h 1" $n >> H2O.$i.Z 
      eval echo "h 1" $m "2" $a >> H2O.$i.Z 

      let i=$i+1 
      let a=$a+5.0 
     done 
     let m=$m+0.05 
    done 
    let n=$n+0.05 
done 

저는 zsh를 처음 사용했습니다. 내 구문이 잘못 되었나요?

+0

구문이 잘못 되었다면 한 번 반복되지 않습니다. 'eval' 연산은 흥미 롭습니다; 그들이하는 유일한 일에 대해서, 나의 (Bourne shell conditioning) 계산법은 에코 된 자료에서'h'와'1' 사이의 여분의 공간을 제거하는 것입니다. –

답변

4

-le 연산자는 정수에서 동작한다. 부동 소수점의 경우 내장 산술을 사용하십시오. 내부 루프에 실제로 ma의 값을 다시 초기화하려고한다고 생각합니다. 그런 다음 버그는 초기에 한 번만 초기화했고 두 번째 반복에서는 내부 루프 조건이 거짓이라는 점이 버그입니다.

당신이 더 컴팩트 작성하는 for((;;)) 루프를 사용할 수 있습니다 :

#!/usr/local/bin/zsh 
i=1 
for ((n=0.5; n <= 1.5; n+=0.05)); do 
    for ((m=0.5; m <= 1.5; m+=0.05)); do 
    for ((a=60.0; a <= 160; a+=5.0)); do 
     echo $i $a $m $n 
     let i=$i+1 
    done 
    done 
done 

참고 또한 루프를 계산 부동 소수점 숫자를 사용하는 것은 현명하지 입니다. 10 배의 0.1이 거의 없다는 것을 알고 계셨습니까? 이것은 당신이 여분의 반복을 잃거나 얻는 이유를 설명 할 수 있습니다. 대신에 정수 N을 사용하여 반복하고 0.5 + N * 0.05와 같이 필요한 부동 소수점을 계산해야합니다.

+0

감사합니다. 이것은 잘 작동합니다. –

+0

@DominiqueNocito 여러분, 천만입니다. 다음 단계는 왼쪽에있는 "확인"기호를 클릭하여 받아 들일만한 대답을 수락하는 것입니다. 이것은 또 다른 두 점을 얻을 것이다. – Jens

1

-le 연산자는 정수 비교 만 지원합니다. 부동 소수점의 경우 ((...)) 명령을 사용해야합니다. 또한 eval이 필요하지 않으며 3 개의 에코를 하나의 명령으로 결합하여 한 번만 리디렉션하면됩니다.

while ((n < 1.5)); do 
    while ((m < 1.5)); do 
    while ((a <= 160)); do 
     echo $i 
     { echo "o"; echo "h 1" $n; echo "h 1" $m "2" $a; } > H20.$i.Z 
     ((i+=1)) 
     ((a+=5.0)) 
    done 
    ((m+=0.05)) 
    done 
    ((n+=0.5)) 
done 
+0

덕분에 스크립트를 더 깨끗하게 만들었지 만 m으로 문제를 해결하지 못했고 n이 0.05로 증가하지 않았습니다. 잠시 동안 ((n <1.5)) 한주기 만지나갑니다. while ((m <1.5)); 0.55,0.6,0.65가 증가하는 대신 0.5 일 때 루프합니다. –

+1

@chepner 다른 문제는 대개 중첩 된 루프로 수행되는 것처럼 다음 반복에서 'a'와 'm'이 재설정되지 않았을 수 있습니다. – Jens

+0

좋은 지적. 루프에 대한 C 스타일이 부동 소수점 연산을 수행 할 수 있는지 (반복 할 수 없는지) 확인했지만 while 루프 구조는 더 이상 고려하지 않았습니다. – chepner

관련 문제