为什么$ variable不返回shell脚本中最近分配的变量值?

时间:2015-06-10 19:19:21

标签: bash shell variables

例如:

variable="version1"
filename="Testfile_$variable"
echo $filename
variable="version2"
echo $filename
filename="Testfile_$variable"
echo $filename

产生输出:

Testfile_version1
Testfile_version1
Testfile_version2

为什么在更改filename后明确地将值重新分配给filename后,它只会将variable的值更改为“Testfile_version2”?我想当第二个echo $filename被调用时,它会检查filename的值,看看它中有$variable,查找variable的值和看到值已更改,然后将该值放入filename,但似乎情况并非如此。

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:2)

[]未存储对filename的引用,它存储了赋值(variable)中生成的文字字符串。因此,您必须重新分配Testfile_version1才能反映对filename

的更改

答案 1 :(得分:0)

这就是它的工作原理。 shell不会跟踪变量所依赖的变量 - 这里没有“引用”或指针。

执行filename="Testfile_$variable"时,shell会获取$variable的当前值,并从filename中构建新变量$variable

换句话说,它复制$variable的内容而不是引用。

答案 2 :(得分:0)

查找变量的值并将其添加到第一次分配给filename的前缀Testfile_中。之后,更改变量的值不会追溯更新filename的值。

考虑这个问题的另一种方法是你刚刚完成了filename = $ variable。您是否希望更改变量值以更改文件名的值?

更具体地说,变量filename的值是一个字符串,它是通过取一个模板字符串并用一些值(在这种情况下为变量的值)代入它来计算的。完成替换之后,filename的值只是一个字符串,并且不知道它是如何获得该值的。

答案 3 :(得分:0)

在使用时评估过一次。

即,$filename不是Testfile_$variable,而是评估该表达式的结果。

答案 4 :(得分:0)

Bash每次评估表达式时都会执行完整的变量扩展。那是

    filename="Testfile_$variable"

可以解释为

  1. 评估执行变量扩展的表达式"Testfile_$variable"
  2. 将结果字符串分配给变量$filename
  3. 因此,$variable的任何进一步更改都不会影响$filename的价值。

    您可以使用函数而不是变量

    以某种方式更接近您期望的行为
    get_filename(){
      filename="Testfile_$variable"
      echo $filename
    }
    
    variable=version1
    get_filename
    variable=version2
    get_filename
    

    在不明确重新分配变量的情况下打印不同的行。