스크립트 'for 루프'가 예상대로 작동하지 않습니다.

스크립트 'for 루프'가 예상대로 작동하지 않습니다.

Makefile을 생성하는 스크립트를 작성 중입니다. for 루프를 사용하여 "echo... >> Makefile"의 모든 매개변수를 각 대상의 명령 섹션으로 반복했습니다. 예상되는 출력은 다음과 같습니다.

$ makemake.sh a.out -Hello -World
$ cat Makefile

> a.out : appointment.o calendar.o day.o dayofweek.o time.o year.o 
>   g++ -ansi -Wall -g -o a.out -Hello -World

그러나 위의 기술을 사용하면 다음과 같습니다.

echo -n "g++ -ansi -Wall -g -o " >> Makefile
  for arg in $@; do
    echo -n "$@ " >> Makefile
  done 

다음과 같은 결과가 생성됩니다.

a.out : appointment.o calendar.o day.o dayofweek.o time.o year.o 
    g++ -ansi -Wall -g -o a.out -Hello -World a.out -Hello -World a.out -Hello -World 

교수님은 전환을 사용하라고 제안하셨지만 이렇게 하면 다른 목표에 대한 주장을 기억하기가 더 어려워질 것입니다.

왜 이런 일이 발생합니까? 어떡해? 나는 여전히 답을 찾고 있지만, 이 반응 뒤에 숨은 논리에 매우 관심이 있습니다.

답변1

코드에 여러 가지 문제가 있습니다.

  • 루핑 중이지만 루프 내부 가 아닌 arg참조한 루프 내부에 있습니다 . (분명히 이것이 당신이 관찰한 문제가 있는 출력의 원인입니다.)"$@""$arg"
  • 작업 줄이 유효한 Makefile 구문이 되려면 출력 시작 부분에 탭 문자가 포함되어야 합니다.
  • "$@"그 줄 for에서 올바르게 인용 하지 않았습니다 .

그러나 그 이상으로 코드가 불필요하게 복잡합니다. 이 시도.

printf '\tg++ -ansi -Wall -g -o' >>Makefile
printf ' %s' "$@" >>Makefile

그런데, 이런 일이 일부 제어 구조 내에서 발생하면 한 번만 리디렉션하는 것이 더 효율적이고 우아할 수 있습니다. 각 리디렉션으로 인해 파일이 별도로 열리고 닫히며 일반적으로 출력 파일이 이미 존재하는지 여부에 관계없이 한 번만 쓰면 프로세스가 더 쉽습니다.

if things are as you wish them to be; then
    execute code which generates output
fi >Makefile

답변2

에서는 로 make참조할 수 있습니다 . 따라서 상황에 따라 다음과 같이 할 수 있습니다.target$@

shift; echo -e "\tg++ -ansi -Wall -g -o \$@ $@" >> Makefile

관련 정보