Değişkenleri küçük harf olarak kullanmalısınız (en iyi uygulamadır).
Bu yüzden FILENAME ve EXTENSION yerine dosya adını ve uzantısını kullanacağım
“Dosya adı bir dosyadan okunur” dediğiniz gibi, betiğin şöyle olduğunu varsayacağım:
read -r filename <file.txt
extension=World.txt
Ve hem değişkenleri $ dosyaadı hem de $ eklentisini bir alt çizgi ile birleştirmek istediğinizde _
.
Sağladığınız örnekler (hariç: çift değil \) burada doğru çalışır:
name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension
Diğerleri gibi:
name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"
Yani, probleminiz değişkenlerin nasıl birbirine yapışması ile değil, değişkenlerin içeriğiyle ilgilidir. Bunu düşünmek mantıklı görünüyor:
read -r filename <file.txt
\r
Bir windows dosyasından okunuyorsa izleyen bir satır başı okuyacaktır .
Basit bir çözüm (ksh, bash, zsh için) tüm kontrol karakterlerini okuma değişkeninden kaldırmaktır:
filename=${filename//[[:cntrl:]]/}
Bu satır başı getirisi olan bir değerle simüle edilebilir:
$ 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
Veya değeri değiştirerek filename
:
$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end
Sonuç.
Yani bu:
name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"
name
Diğer değişkenler kontrol karakterleri içermesine rağmen doğru değeri elde eder .