我有这个变量:
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
答案4
Shell 知道这$toto
是一个值为 的变量123456
。
因此,无论它在哪里找到它,$toto
都会将其替换为123456
.
因此,在 的情况下$toto.hihi.log
,shell 会像串联运算符一样替换$toto
为as并按预期创建文件。 123456
.
但是,在 的情况下$totohihi.log
,shell 找不到任何名为 的变量$totohihi
,因此将其替换为空字符串,从而创建文件.log
。您可能会发现它以ls -a
或ls .log
开头的文件.
是隐藏文件,无法使用简单的命令看到ls
。
如果您需要创建名为 name 的文件123456hihi.log
,则必须按照其他人在之前的答案中提到的那样放入$toto
大括号。${toto}hihi.log