Bash脚本不会评估文件名中的变量

时间:2017-12-09 10:05:53

标签: linux bash

我有一个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 .

它有效

2 个答案:

答案 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