Bash: reemplazar parte del nombre del archivo

Tengo un comando que quiero ejecutar en todos los archivos de una carpeta, y la sintaxis del comando se ve así:

tophat -o <output_file> <input_file>

Lo que me gustaría hacer es un script que recorra todos los archivos en una carpeta arbitraria y también use los nombres de los archivos de entrada para crear nombres de archivo de salida similares pero diferentes. Los nombres de los archivos se ven así:

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

Hacer que la entrada al trabajo parezca bastante simple:

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

Traté de usaroutput=${f,.fastq,.bam} y usar eso como parámetro de salida, pero eso no funciona. Todo lo que obtengo es un error:line 3: ${f,.fastq,.bam}: bad substitution. ¿Es esta la forma de hacer lo que quiero o debería hacer otra cosa? Si es la forma correcta, ¿qué estoy haciendo mal?

[EDITAR]:

¡Gracias por todas las respuestas! Sin embargo, una pregunta adicional ... ¿Qué pasa si tengo archivos con este nombre?

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

... donde puedo tener un número arbitrario de muestras (sampleX), pero todos tienen dos archivos asociados (_1 y_2) El comando ahora se ve así:

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

Entonces, todavía hay una sola salida, por la cual podría hacer algo como"${f/_[1-2].fastq/.bam}", pero no estoy seguro de cómo obtener un bucle que solo se repite una vez cadasampleX al mismo tiempo que toma los dos archivos asociados ... ¿Ideas?

[EDITAR # 2]:

Entonces, ¡este es el guión final que hizo el truco!

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta