Я использую свой собственный скрипт ccc для компиляции .c файлов, например так:

g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o "${1%%.c}.out" -lm "$1"

В основном я использую ccc main.c а затем main.out выходит. Теперь я также хочу скомпилировать файлы .cpp используя тот же сценарий. Пока у меня есть это:

#!/bin/bash

if [ "$1" == "*.cpp" ]; then
    g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o "${1%%.cpp}.out" -lm "$1"
    echo "g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o ${1%%}.out -lm $1"
elif [ "$1" == "*.c" ]; then
    g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o "${1%%.c}.out" -lm "$1"
    echo "g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o ${1%%}.out -lm $1"
else
    echo "Error - file does not exist or wrong type"
fi

Однако теперь файлы .cpp и .c не компилируются, и мой errmsg отображается. В чем была моя ошибка?

2 ответа2

0

Ваши операторы сравнения не используют то, как вы думаете, они.

Когда вы проверяете на наличие =="*.c" или =="*.cpp" он проверяет, соответствует ли это фактической строке.

То, что вы хотите, это сравнение регулярных выражений.

if [[ $1 =~ $regex ]]; then

Для фактического регулярного выражения символ ^ обозначает "начинается с", а $ обозначает "заканчивается с", поэтому

if [[ $1 =~ ^[a-zA-Z0-9]*\.cpp$ ]]; then

может быть хорошим началом для проверки файлов cpp и

if [[ $1 =~ ^[a-zA-Z0-9]*\.c$ ]]; then

для файлов c.

Один навык, который я настоятельно рекомендую всем, кто является системным администратором (особенно в системе * nix) или занимается любым видом сценариев / программирования / разработки, - это научиться использовать регулярные выражения. Там довольно мало учебников и шпаргалок, вот первый в моей коллекции закладок - https://www.maketecheasier.com/regular-expressions-cheat-sheet/

0

Ваши тесты if не проверяют файлы * .c и * .cpp, они проверяют, является ли аргумент буквально «* .cpp» или «* .c».

Попробуйте это, чтобы увидеть ваши условия срабатывания:
ccc "*.cpp"
ccc "*.c"

Основываясь на этом посте, я вижу, что вы можете получить желаемое поведение, удалив кавычки вокруг "* .cpp" и добавив дополнительную пару скобок:
if [[ "$1" == *.cpp ]]; then

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .