Скрипт оболочки для компиляции файлов на языке 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", а не по команде вывода, как вы предполагали. Это можно исправить с помощью оператора подстановки команд (например, for i in $(ls *.c); do...), но, как указывает slmв своем ответеэта команда вообще не нужна, так как вы можете использовать вывод подстановки оболочки в цикле 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. Удалить скомпилированные программы (очистить), запустив make clean. (Частично исходный кодМартин)

Связанный контент