$1 - Die Dateiendung löschen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
The Torso
Beiträge: 882
Registriert: 13.07.2003 12:46:40
Lizenz eigener Beiträge: MIT Lizenz

$1 - Die Dateiendung löschen

Beitrag von The Torso » 14.07.2004 10:54:08

Ich hab mir folgendes zurechgeschnippselt und unter /usr/bin/gmake abgespeichert:

Code: Alles auswählen

#!/bin/bash
g++ $1.cpp -o $1.out && ./$1.out
Aufgerufen wird das ganze jetzt mit

Code: Alles auswählen

gmake programmname
Nun stört mich an dem Programm einiges:

1. Ich kann den Programmnamen nicht mit der Dateiendung (.cpp, .cc ...) übergeben.
2. Der Programmname muss mit .cpp enden!

Nun meine Frage:
Wie bring ich es zu stande, dass ich den Namen der zu übersetzenden Datei (datei.cpp oder datei.cc ...) auf einen String ohne Dateiendung hinbekomme (soll natürlich nur eine Kopie werden, damit ich $1 immer noch benutzen kann!)?

Hat jemand also eine Idee, wie ich $1 so bearbeite, dass alle Zeichen von hinten, einschließlich des Punktes, gelöscht werden?

Vielen Dank schon im voraus,
cg

P,S.: Ich weiß, das ganze schaut nicht sehr professionell aus, aber was solls, es erfüllt seinen Zweck!
Debian GNU/Linux 00101010

LittleBoy
Beiträge: 718
Registriert: 30.04.2002 14:32:26

Beitrag von LittleBoy » 14.07.2004 11:04:58

Das geht mit der Bahs Parameter expansion - irgendwie ${1%.} oder so ähnlich müsste das gehen. (man bash . suche nach ${parameter%word} )

Benutzeravatar
labor78
Beiträge: 163
Registriert: 13.07.2004 10:29:58

Beitrag von labor78 » 14.07.2004 11:37:58

Versuchs mal mit dem folgenden Skript:

Code: Alles auswählen

#!/bin/bash
INFILE=$1
OUTFILE=${1%.*}.out
g++ $INFILE -o $OUTFILE && ./$OUTFILE
Der Ausdruck `${1%.*}' entfernt alles vom Stringende bis einschließlich dem ersten Punkt.

Gruß

Björn
May the source be with you...

Benutzeravatar
The Torso
Beiträge: 882
Registriert: 13.07.2003 12:46:40
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von The Torso » 14.07.2004 11:46:17

Danke, das funktioniert super, ich hab das mittlerweile auf folgendes gebracht.

Code: Alles auswählen

g++ $1 -o $(basename $1 .${1##*.}).out && ./$(basename $1 .${1##*.}).out
Ist aber nicht so schön wie deine Lösung, danke!
Debian GNU/Linux 00101010

Antworten