用下划线连接两个变量

Rhy*_*yuk 72 bash shell-script

我需要连接两个变量来创建一个带有下划线的文件名。让我们调用我的变量$FILENAME以及$EXTENSION从文件中读取文件名的位置。

FILENAME=Hello
EXTENSION=WORLD.txt
Run Code Online (Sandbox Code Playgroud)

现在...

我尝试了以下但没有成功:

NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
Run Code Online (Sandbox Code Playgroud)

我总是得到某种奇怪的输出。通常下划线在前。

我需要它

echo $NAME
Hello_WORLD.txt
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 91

你可以使用这样的东西:

NAME=$(echo ${FILENAME}_${EXTENSION})
Run Code Online (Sandbox Code Playgroud)

这也有效:

NAME=${FILENAME}_${EXTENSION}
Run Code Online (Sandbox Code Playgroud)

  • 第一个命令破坏了变量的值,使用命令替换和 `echo` 不可能有帮助。问题中已经给出了第二个命令。 (2认同)

Sté*_*las 15

您的:

NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
Run Code Online (Sandbox Code Playgroud)

都很好,所以会:

NAME=${FILENAME}_${EXTENSION}
NAME=$FILENAME'_'$EXTENSION
NAME=$FILENAME\_$EXTENSION
NAME=$FILENAME"_$EXTENSION"
Run Code Online (Sandbox Code Playgroud)

(但肯定不是 NAME=$(echo ${FILENAME}_${EXTENSION})因为它使用echosplit+glob运营商)。

NAME=$FILENAME_$EXTENSION
Run Code Online (Sandbox Code Playgroud)

将是相同的:

NAME=${FILENAME_}${EXTENSION}
Run Code Online (Sandbox Code Playgroud)

as _(与\or相反')是变量名中的有效字符。

你的问题是你有用 CRLF 而不是 LF 分隔的行,这意味着这些变量内容以 CR 字符结尾。

CR 字符在写入终端时告诉终端将光标移动到行首。因此,Hello<CR>_WORLD.TXT<CR>当发送到终端时将显示为_WORLD.TXT(覆盖Hello)。