我有一个bash脚本,可以创建我的文件夹的备份。它应该使用版本号命名tar gz文件,但它不是:
#!/bin/bash
ver='1.2.3'
tar czf $ver_myfolder.tar.gz .
预期产出:
1.2.3_myfolder.tar.gz
实际输出:
_myfolder.tar.gz
如果我附加这样的变量:
#!/bin/bash
ver='1.2.3'
tar czf myfolder-$ver.tar.gz .
它有效
答案 0 :(得分:3)
你应该在这里使用${var}
,因为你在它之后追加下划线,它被认为是变量名的有效字符。由于这个事实,shell不知道您是否正在扩展变量名称$ver
或$ver_myfolder
:
ver='1.2.3'
tar czf "${ver}_myfolder.tar.gz" .
由于未设置$ver_myfolder
,因此您获得一个空值。
答案 1 :(得分:0)
因为下划线是变量名称的有效字符,所以您应该使用大括号显式指定变量的范围:
${ver}_myfolder.tar.gz
^ ^
没有大括号,Bash实际上会尝试解析
${ver_myfolder}.tar.gz
对于您编辑的问题,这是因为点不是变量名的有效字符,因此Bash不会尝试将点解析为名称查找。即使您将其放入大括号,包含点的变量名仍然无效:
$ echo ${ver.}
bash: ${ver.}: bad substitution
$ ver.=1.2.3
ver.=1.2.3: command not found