使用变量通过触摸创建文件

使用变量通过触摸创建文件

我有这个变量:

toto=123456

为什么touch "$toto.hihi.log"有效并创建一个名为的文件123456.hihi.log

touch "$totohihi.log"什么也没做?

答案1

你需要

touch "${toto}hihi.log"

问题是如果没有大括号,shell 就无法知道变量名中有多少个字符。因此,它将所有合法字符视为名称的一部分。在这种情况下,这是.;之前的所有内容。即 shell 使用不存在的变量$totohihi

一般来说,使用 shell 选项-x来查看正在发生的情况会有所帮助:

set -x
touch "$totohihi.log"
    + touch .log

答案2

确实如此,它扩展$totohihi为空字符串,然后运行touch ".log"(假设该变量未在其他地方设置)。尝试看看ls -l .log说什么。

正如其他答案所提到的,如果以下字符可以是变量名称的一部分,则需要将变量名称括在大括号中,因此touch "${toto}hihi.log".请注意,下划线在变量名称中与字母和数字一起也是有效的,因此"${toto}_hihi.log"也需要大括号。

答案3

$totohihi.log 表示带有名称的变量totohihi

为了让它工作,使用

${toto}hihi.log

这个 stackoverflow 答案有很好的解释

答案4

Shell 知道这$toto是一个值为 的变量123456
因此,无论它在哪里找到它,$toto都会将其替换为123456.
因此,在 的情况下$toto.hihi.log,shell 会像串联运算符一样替换$toto为as并按预期创建文件。 123456.

但是,在 的情况下$totohihi.log,shell 找不到任何名为 的变量$totohihi,因此将其替换为空字符串,从而创建文件.log。您可能会发现它以ls -als .log开头的文件.是隐藏文件,无法使用简单的命令看到ls

如果您需要创建名为 name 的文件123456hihi.log,则必须按照其他人在之前的答案中提到的那样放入$toto大括号。${toto}hihi.log

相关内容