Dovresti usare le variabili in minuscolo (è la migliore pratica).
Quindi, userò il nome del file e l'estensione invece di FILENAME ed EXTENSION
Come dici che "il nome del file viene letto da un file", suppongo che lo script sia:
read -r filename <file.txt
extension=World.txt
E che si desidera concatenare entrambe le variabili $ nomefile e $ estensione con un trattino basso _
.
Gli esempi forniti (tranne: no double \) funzionano correttamente qui:
name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension
Come alcuni altri:
name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"
Quindi, il tuo problema non è con il modo in cui le variabili si uniscono, ma con il contenuto delle variabili. Sembra ragionevole pensare che questo:
read -r filename <file.txt
leggerà un ritorno a capo finale \r
se si legge da un file di Windows.
Una soluzione semplice (per ksh, bash, zsh) è rimuovere tutti i caratteri di controllo dalla variabile di lettura:
filename=${filename//[[:cntrl:]]/}
Questo potrebbe essere simulato con un valore che ha un ritorno a capo:
$ filename=$'Hello\r'
$ echo "starting<$filename>end"
>endting<Hello ### note the return to the start of line.
$ echo "starting<${filename//[[:cntrl:]]/}>end"
starting<Hello>end
Oppure, sostituendo il valore di filename
:
$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end
Conclusione.
Così questo:
name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"
Otterrà il valore corretto name
anche se gli altri var contengono caratteri di controllo.