
Раньше у меня был скрипт оболочки, который компилировал все файлы 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
. (Частично исходный кодМартин)