変数は小文字で使用する必要があります(ベストプラクティスです)。
そのため、FILENAMEとEXTENSIONの代わりにファイル名と拡張子を使用します
「ファイル名はファイルから読み取られる」と言うように、スクリプトは次のようになります。
read -r filename <file.txt
extension=World.txt
そして、変数$ filenameと$ extensionの両方をアンダースコアで連結したいこと_
。
ここで提供する例(ただし、二重\はありません)は、ここで正しく機能します。
name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension
他のいくつかのように:
name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"
したがって、問題は変数がどのように結び付いているかではなく、変数の内容にあります。これを考えるのは理にかなっているようです:
read -r filename <file.txt
\r
Windowsファイルから読み取る場合、末尾のキャリッジリターンを読み取ります。
1つの簡単な解決策(ksh、bash、zshの場合)は、読み取り変数からすべての制御文字を削除することです。
filename=${filename//[[:cntrl:]]/}
これは、キャリッジリターンのある値でシミュレートできます。
$ 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
または、次の値を置き換えますfilename
。
$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end
結論。
したがって、この:
name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"
name
他の変数に制御文字が含まれている場合でも、正しい値を取得します。