Bash: Ersetze einen Teil des Dateinamens

Ich habe einen Befehl, den ich für alle Dateien eines Ordners ausführen möchte, und die Syntax des Befehls sieht folgendermaßen aus:

tophat -o <output_file> <input_file>

Was ich tun möchte, ist ein Skript, das alle Dateien in einem beliebigen Ordner durchläuft und auch die Eingabedateinamen verwendet, um ähnliche, aber unterschiedliche Ausgabedateinamen zu erstellen. Der Dateiname sieht folgendermaßen aus:

input name                desired output name
path/to/sample1.fastq     path/to/sample1.bam
path/to/sample2.fastq     path/to/sample2.bam

Die Eingabe zum Funktionieren zu bringen, scheint einfach zu sein:

for f in *.fastq
do
     tophat -o <output_file> $f
done

Ich habe versucht mitoutput=${f,.fastq,.bam} und das als Ausgabeparameter verwenden, aber das funktioniert nicht. Alles was ich bekomme ist ein Fehler:line 3: ${f,.fastq,.bam}: bad substitution. Ist dies der Weg, um zu tun, was ich will, oder sollte ich etwas anderes tun? Wenn es der richtige Weg ist, was mache ich dann falsch?

[BEARBEITEN]

ielen Dank für alle Antworten! Eine Bonusfrage, aber ... Was ist, wenn ich Dateien mit dem folgenden Namen habe:

path/to/sample1_1.fastq
path/to/sample1_2.fastq
path/to/sample2_1.fastq
path/to/sample2_2.fastq
...

... wo ich beliebig viele Samples haben kann sampleX), aber allen sind zwei Dateien zugeordnet _1 und_2). Der Befehl sieht jetzt so aus:

tophat -o <output_file> <input_1> <input_2>

So, es gibt immer noch nur den einen Ausgang, für den ich so etwas wie @ machen könn"${f/_[1-2].fastq/.bam}", aber ich bin nicht sicher, wie man eine Schleife erhält, die nur einmal über jedes @ iteriesampleX gleichzeitig mit den beiden zugehörigen Dateien ... Ideen?

[EDIT # 2]:

So, das ist das letzte Skript, das den Trick gemacht hat!

for f in *_1.fastq
do
        tophat -o "${f/_1.fastq/.bam}"  $f "${f/_1.fastq/_2.fasq}"
done

Antworten auf die Frage(3)

Ihre Antwort auf die Frage