2017-12-04 10 views
1

루프 내에서 변수를 변경하려고하는데 오류가 있습니다. 여기 내 메이크 파일의 일부입니다.루프 내에서 메이크 파일이 변수를 변경합니다.

export CLOCK_PERIOD = 30; 
syn_clock: 
    for number in 1 2 3 4 ; do \ 
     echo $$CLOCK_PERIOD; \ 
     echo $$number; \ 
     $$CLOCK_PERIOD = $$number; \ 
    done 

make syn_clock의 결과는 다음 줄에 실패 : 나는 CLOCK_PERIOD 루프주기 동안 1에서 4로 변경 기대하고

bash-4.2$ make syn_clock 
for number in 1 2 3 4 ; do \ 
     echo $CLOCK_PERIOD; \ 
     echo $number; \ 
     $CLOCK_PERIOD = $number; \ 
done 
30 
1 
/bin/sh: line 3: 30: command not found 
30 
2 
/bin/sh: line 3: 30: command not found 
30 
3 
/bin/sh: line 3: 30: command not found 
30 
4 
/bin/sh: line 3: 30: command not found 
make: *** [syn_clock] Error 127 

.

내가 뭘 잘못하고 있니?

+2

쉘 구문은 "$ FOO = 42"가 아닌 "FOO = 42"를 사용합니다. CLOCK_PERIOD를 할당하는 행은 시작 부분에 $를가집니다. –

답변

0

이미 제안 된대로 this comment에서 Bash 쉘의 변수에 지정할 때 할당 연산자를 둘러싼 공간과 할당 할 변수의 이름 인 후행 $을 제거하십시오. 즉, $$CLOCK_PERIOD = $$number 대신 CLOCK_PERIOD=$$number입니다.

은 메이크 export CLOCK_PERIOD = 30; 때문에 make에 의해 실행됩니다, 그리고 쉘, 결과는 당신이 ( CLOCK_PERIOD의 값이 대신 3030; 예정) 기대하지 않을 수 있습니다. 그래서 this comment에서 제안한대로 후행 세미콜론을 제거했습니다.

제안 된 해결책은 다음

export CLOCK_PERIOD = 30 
syn_clock: 
    for number in 1 2 3 4 ; do \ 
     echo $$CLOCK_PERIOD; \ 
     echo $$number; \ 
     CLOCK_PERIOD=$$number; \ 
    done 

의 제 $ 이중 $$number$ 실제로 메이크에 관한 것이다 : 그것은 메이크 내부 $ 제 이스케이프되도록 셸 $을 수신하고 그렇지 않은 경우 $number이라고 쓰면 make${n}umber으로 해석합니다. make은 변수의 값을 확장합니다.이고이 결과는 umber과 연결됩니다. 그것은 쉘이 받게 될 것입니다.

+1

'export CLOCK_PERIOD = 30;'은 make 구문이며'= '연산자 주위에 원하는만큼의 공백을 넣을 수 있습니다. 게다가 말미의 세미 콜론은 아마도 OP가 정말로 원했던 것이 아닙니다. 고마워,'export CLOCK_PERIOD = 30' 또는'export CLOCK_PERIOD = 30'은 모두 괜찮을 것입니다. (후행없이 ;;;) –

+0

@RenaudPacalet 감사합니다. 'make '로 실행하십시오. 네가 세미콜론에 대해서도 맞다면,'CLOCK_PERIOD'에 단지'30' 대신에'30;'을 할당 할 것이다. –