C 파일을 컴파일하는 쉘 스크립트

C 파일을 컴파일하는 쉘 스크립트

한때 디렉토리의 모든 FILE.c 파일을 FILE.out으로 컴파일하는 쉘 스크립트가 있었습니다.

나는 그것을 잃어버렸고 그것을 다시 만들려고 노력하고 있으며 다음을 얻었습니다. 매우 유사하다는 것을 알고 있지만 어디서 잘못되었는지는 모릅니다.

#!/usr/bin/env bash

for i in 'ls *.c'
do
    gcc -g3 -o3 $i -o {$i%.}.out
done

답변1

이 명령을 실행할 필요는 없습니다 ls *.c. Bash는 자동으로 와일드카드 패턴을 확장합니다. 따라서 정말 절망적이어서 Makefile을 만들고 싶지 않다면 다음과 같이 할 수 있습니다.

#!/usr/bin/env bash

for i in *.c
do
    echo "gcc -g3 -o3 $i -o ${i%.c}.out"
    # gcc -g3 -o3 "$i" -o "${i%.c}.out"
done

다음과 같은 샘플 데이터가 있다고 가정해 보겠습니다.

$ ls -1
a.c
b.c
c.bash
c.c
d.c
e.c

내 스크립트를 실행하십시오 c.bash.

$ ./c.bash 
gcc -g3 -o3 a.c -o a.out
gcc -g3 -o3 b.c -o b.out
gcc -g3 -o3 c.c -o c.out
gcc -g3 -o3 d.c -o d.out
gcc -g3 -o3 e.c -o e.out

스크립트를 실행하려면 echo위 줄을 주석 처리한 다음 이 gcc줄의 주석 처리를 제거해야 합니다.

답변2

귀하의 질문을 구체적으로 살펴보면 "어디에서 잘못되었는지"가 매개변수 확장에 있는 것 같습니다. 여기서 출력 파일의 이름을 지정할 때 i 값을 변경하려고 하는 것 같습니다.

{$i%.} 

달러 기호를 잘못 보신 것 같아요. 아마도 다음과 같은 의미일 것입니다.

${i%.}

솔직히 말하면 원래 파일 이름에서 "."만 제거됩니다. 그리고 "filename.c"는 "filenamec.out"을 생성합니다. 다음을 수행할 수 있습니다.

${i%.*}

그러면 "filename.out"이 생성됩니다. 이 매개변수 확장 구문은 "."로 시작하는 모든 항목을 욕심 없이 제거하는 것으로 변환됩니다. 후에. 욕심 많은 삭제의 경우 구문은 다음과 같습니다.

${i%%.*}

이것이 귀하의 코드와 관련되어 귀하의 질문에 더 나은 답변이 되기를 바랍니다.

답변3

for 루프는 원하는 출력 명령이 아닌 for i in 'ls *.c'문자열 " "을 반복합니다 . 이는 ls *.c명령 대체 연산자(예: )를 사용하여 해결할 수 있지만 slm이 지적했듯이for i in $(ls *.c); do...그의 대답에for 루프에서 쉘 와일드카드의 출력을 사용할 수 있으므로 이 명령은 전혀 필요하지 않습니다. :)

간단한 makefile을 사용하면 전체 문제를 더 정확하게 해결할 수도 있습니다.

CC = gcc
CFLAGS = -std=c99 -pedantic -D_XOPEN_SOURCE=600 -Wall -Werror -g
RM = rm -f
SRCS = $(wildcard *.c)
PROGS = $(patsubst %.c,%,$(SRCS))

.PHONY: all clean

all: $(PROGS)

%: %.c
    $(CC) $(CFLAGS) -g3 -o3 -o $@ $<

clean:
    $(RM) $(PROGS)

"Makefile"로 저장하고 실행합니다 make. (clean) 을 실행하여 컴파일된 프로그램을 제거합니다 make clean. (부분적으로 파생됨남자 이름)

관련 정보