您应该使用小写字母的变量(这是最佳做法)。
因此,我将使用文件名和扩展名而不是FILENAME和EXTENSION
当您说“从文件读取文件名”时,我假设脚本是:
read -r filename <file.txt
extension=World.txt
并且您想用下划线连接变量$ filename和$ extension _
。
您提供的示例(除了:no double \)在这里可以正常工作:
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文件读取,将读取尾随回车符。
一种简单的解决方案(针对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
即使其他变量包含控制字符,也将获得正确的值。