Como manipular dois argumentos possíveis?

0

Eu uso meu script personalizado ccc para compilar .c arquivos como este:

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

Basicamente eu uso ccc main.c e então main.out sai. Agora eu também quero compilar arquivos .cpp usando o mesmo script. Até agora eu tenho isso:

#!/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

No entanto, agora os arquivos .cpp e .c não são compilados e meu errmsg é ecoado. Qual foi o meu erro?

    
por Hichigaya Hachiman 06.07.2017 / 03:26

2 respostas

0

Seus testes if não estão verificando arquivos * .c e * .cpp, eles estão verificando se o argumento é literalmente "* .cpp" ou "* .c".

Tente ver suas condições acionadas:
ccc "*.cpp" e ccc "*.c"

Com base em este post , vejo que você pode obter o comportamento você deseja removendo as aspas ao redor do "* .cpp" e adicionando um par extra de colchetes:
if [[ "$1" == *.cpp ]]; then

    
por 06.07.2017 / 03:56
0

Seus operadores de comparação não estão se concentrando da maneira como você acha que eles estão se globbing.

Quando você verifica =="*.c" ou =="*.cpp" , está verificando se corresponde a essa cadeia real.

O que você quer é a comparação de expressões regulares.

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

Para a expressão regular real, o caractere ^ indica "começa com" e $ indica "termina com", portanto

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

pode ser um bom começo para verificar arquivos cpp e

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

para arquivos c.

A única habilidade que eu recomendo strongmente para quem é um administrador de sistema (especialmente em um sistema * nix) ou qualquer tipo de script / programação / desenvolvimento é aprender a usar expressões regulares. Existem alguns tutoriais e folhas de fraude lá fora, aqui está o primeiro da minha coleção de marcadores - link

    
por 06.07.2017 / 03:53