한때 디렉토리의 모든 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
. (부분적으로 파생됨남자 이름)