Innanzitutto, dovresti essere esplicito su ciò che desideri. Se sai che la stringa finisce .rtfe vuoi rimuoverla .rtf, puoi usarla var2=${var%.rtf}. Se non sai qual è il suffisso ma vuoi rimuovere tutto a partire dall'ultimo ., puoi usare var2=${var%.*}. Se vuoi mantenere tutto fino al primo ., puoi usarlo var2=${var%%.*}. Queste ultime due opzioni hanno lo stesso risultato se c'è un solo periodo, ma se potrebbe essercene più di uno, dovresti decidere quale vuoi.
Se vuoi davvero rimuovere sempre un numero esatto di caratteri, ecco alcune opzioni.
Hai specificato bash in modo specifico, quindi inizieremo con i builtin bash. Quello che ha funzionato più a lungo è la stessa sintassi di rimozione del suffisso che ho usato sopra: per rimuovere quattro caratteri, usare var2=${var%????}. È necessario rimuovere un punto interrogativo per carattere, quindi diventa ingombrante per lunghezze di sottostringa più grandi.
Un po 'più recente è sottoStringa estrazione: var2=${var::${#var}-4}. Qui puoi inserire qualsiasi numero al posto di 4per rimuovere un diverso numero di caratteri. ( ${#var}Viene sostituito dalla lunghezza della stringa, quindi questo in realtà chiede di mantenere i primi (lunghezza - 4) caratteri.)
Le versioni più recenti di bash (in particolare 4+, il che significa che quella fornita con MacOS non funzionerà) ti consente di semplificare questo per solo var2=${var::-4}.
Se in realtà non stai usando bash ma qualche altra shell di tipo POSIX, la rimozione del suffisso continuerà a funzionare, anche con un trattino vecchio (dove nessuno degli altri lo farà). In zsh, tutti lavorano, ma si devono mettere una 0tra le due punti: var2=${var:0:-4}ecc ksh, è necessario il 0 e hanno anche di utilizzare l'esplicito lunghezza-4 espressione: var2=${var:0:${#var}-4}.
Ovviamente puoi usare la sostituzione dei comandi per farlo con l'aiuto di un programma di utilità; ce ne sono molti che funzioneranno, ma qualcosa del genere var2=$(cut -c -4 <<<"$var")è probabilmente l'opzione più breve.