Anda harus menggunakan variabel dalam huruf kecil (ini adalah praktik terbaik).
Jadi, saya akan menggunakan nama file dan ekstensi sebagai ganti FILENAME dan EXTENSION
Seperti yang Anda katakan bahwa "nama file dibaca dari file", saya akan menganggap bahwa skripnya adalah:
read -r filename <file.txt
extension=World.txt
Dan Anda ingin menggabungkan kedua variabel $ nama file dan $ ekstensi dengan garis bawah _
.
Contoh yang Anda berikan (kecuali: tidak ada dobel \) berfungsi dengan benar di sini:
name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension
Seperti beberapa lainnya:
name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"
Jadi, masalah Anda bukan dengan bagaimana variabel tetap bersatu, tetapi dengan isi vars. Tampaknya masuk akal untuk berpikir bahwa ini:
read -r filename <file.txt
akan membaca carriage carriage return \r
jika membaca dari file windows.
Salah satu solusi sederhana (untuk ksh, bash, zsh) adalah menghapus semua karakter kontrol dari variabel baca:
filename=${filename//[[:cntrl:]]/}
Ini bisa disimulasikan dengan nilai yang memiliki carriage return:
$ 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
Atau, mengganti nilai filename
:
$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end
Kesimpulan.
Jadi ini:
name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"
Akan mendapatkan nilai yang benar name
bahkan jika vars lain berisi karakter kontrol.