ATUALIZAÇÃO:
Para imprimir em um arquivo como você indica, aqui está um script atualizado:
#!/bin/bash
read -p 'How many tracks are there?' TRACKCOUNT
TRACK=1
while [ $TRACK -le $TRACKCOUNT ]
do
read -p "Track $TRACK: " TTITLE
echo "TTITLE$TRACK=${TTITLE:-No Name}" >> ./track_output.txt
(( TRACK++ ))
done
Para responder ao título da sua pergunta, consertar seu script para funcionar, e ir um pouquinho mais para cuspir os resultados em uma matriz indexada pelo número da faixa (por seu comentário):
#!/bin/bash
declare -a TRACK_ARRAY
read -p 'How many tracks are there?' TRACKCOUNT
TRACK=1
while [ $TRACK -le $TRACKCOUNT ]
do
read -p "Track $TRACK: " TTITLE
TRACK_ARRAY[$TRACK]="${TTITLE:-No Name}"
(( TRACK++ ))
done
echo "${TRACK_ARRAY[*]}"
Isso leva sua entrada e faz um loop, solicitando corretamente TRACK1 a TRACKN , em que N é o número digitado pelo usuário. No final, simplesmente imprimo todos os índices do array, já que não tenho idéia de como você o utiliza. Esta página é um começo (do TLDP) sobre como você pode trabalhar com esse array em bash
Você estava indexando incorretamente (teria percebido isso rapidamente depois de executá-lo), mas outro problema que você tinha era que estava tentando atribuir um nome de variável que tinha um $ contido nele: set TTITLE$TRACK=TTITLE - isso não criará uma variável chamada TTITLE# , em que # é o valor de $TRACK . Eu não posso dizer com segurança o que isso faz.
Ao tentar usar essa variável, você fez isso: echo ${!TTITLE$TRACK} , em que o estrondo ( ! ) é, na verdade, um estrondo comando tentando encontrar o comando mais recente começando com TTITLE... (não o que você pretendia).