Debe usar variables en minúsculas (es la mejor práctica).
Por lo tanto, usaré el nombre de archivo y la extensión en lugar de FILENAME y EXTENSION
Cuando diga que "el nombre de archivo se lee de un archivo", supondré que el script es:
read -r filename <file.txt
extension=World.txt
Y que desea concatenar ambas variables $ filename y $ extension con un guión bajo _
.
Los ejemplos que proporciona (excepto: no double \) funcionan correctamente aquí:
name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension
Como algunos otros:
name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"
Por lo tanto, su problema no es cómo se unen las variables, sino con el contenido de los vars. Parece razonable pensar que esto:
read -r filename <file.txt
leerá un retorno de carro final \r
si lee desde un archivo de Windows.
Una solución simple (para ksh, bash, zsh) es eliminar todos los caracteres de control de la variable de lectura:
filename=${filename//[[:cntrl:]]/}
Esto podría simularse con un valor que tenga un retorno de carro:
$ 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
O, reemplazando el valor de filename
:
$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end
Conclusión.
Así que esto:
name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"
Obtendrá el valor correcto name
incluso si los otros vars contienen caracteres de control.