我需要连接两个变量来创建一个带有下划线的文件名。让我们调用我的变量$FILENAME
以及$EXTENSION
从文件中读取文件名的位置。
FILENAME=Hello
EXTENSION=WORLD.txt
现在...
我尝试了以下方法但没有成功:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
我总是得到一些奇怪的输出。通常是下划线在前。
我需要它是
echo $NAME
Hello_WORLD.txt
答案1
你可以使用这样的东西:
NAME=$(echo ${FILENAME}_${EXTENSION})
这也有效:
NAME=${FILENAME}_${EXTENSION}
答案2
你的:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
都很好,所以会是:
NAME=${FILENAME}_${EXTENSION}
NAME=$FILENAME'_'$EXTENSION
NAME=$FILENAME\_$EXTENSION
NAME=$FILENAME"_$EXTENSION"
(但当然不是 作为它用NAME=$(echo ${FILENAME}_${EXTENSION})
echo
和运营split+glob
商)。
NAME=$FILENAME_$EXTENSION
会是一样的:
NAME=${FILENAME_}${EXTENSION}
as _
(与\
or相反'
)是变量名中的有效字符。
您的问题是您的行是用 CRLF 而不是仅 LF 分隔的,这意味着这些变量内容以 CR 字符结尾。
当写入终端时,CR 字符告诉终端将光标移动到行的开头。因此,Hello<CR>_WORLD.TXT<CR>
当发送到终端时将显示为_WORLD.TXT
(覆盖Hello
)。
答案3
我已经改用${FILENAME}_${EXTENSION}
上面提到的语法。
$()
当我需要用下划线连接两个变量时,我曾经使用过。例如,$YYYYMMDD$()_$HHMMSS
生成包含 YYYYMMDD_HHMMSS 格式的时间戳的文件名。中间部分$()
不返回任何内容,并将两个变量分开。
我曾经time
使用该方法和上面的一些方法来测量分配$YYYYMMDD$()_$HHMMSS
,并且它们在我使用它的旧服务器上都报告了 0ms。性能似乎不是问题。
答案4
NAME=${FILENAME}_$EXTENSION
当然,这是最好的答案,并且应该是公认的答案。但是,本着用户208145的回答,这是一个替代方案:
UNDERSCORE='_'
NAME=$FILENAME$UNDERSCORE$EXTENSION