我认为下面的行应该以不同的方式编写,并且该命令应该会出错。
$ echo $((x=2, y=3, x+y))
5
我认为写这个的方法是:
$ echo $((x=2, y=3, $x+$y))
5
两者都有效,现在让我感到困惑。我假设我在某处有误解,所以我将解释我如何确定第一个回声是错误的。x+y 没有引用一个变量,所以 bash 怎么可能知道 x 和 y 是一个变量。如果您告诉我这是因为表达式开头的 $,那么您一定是错的,因为 x 和 y 会定义在 $x=2 和 $y=2 处,这将是定义变量的错误方法。所以我完全不知道 bash 如何知道 x 和 y 是变量。
man bash
,ARITHMETIC EVALUATION
这样描述它:在
$(())
中,它不能是命令、字符串或 shell 通常必须处理的任何其他内容,因此它会扩展变量。它允许分配,因此您正在分配变量。但是,实际上您的第二个示例不起作用:
在第一次尝试中,x 和 y 尚未分配。在第二次尝试中,它使用了先前分配的值,因此您得到了意想不到的结果(5 而不是 9)。
当您使用
$
时,shell 在进行算术评估之前将其展开。因此,算术评估中的赋值发生得太晚,无法影响$
扩展。也可以做一些奇怪的事情,比如:
如果您在算术评估之外分配一个变量,它只是一个字符串。然后你使用
$
,shell 将它扩展为一个字符串。然后进行算术评估,您必须处理运算符优先级。因此结果
1+2+3*2 = 9
不是6*2 = 12
。在此示例中,算术评估发生在赋值之前,因此 x=6 而不是 x=1+2+3。