使用空变量进行Bash算术扩展行为

时间:2016-06-19 03:07:54

标签: bash

我无法理解bash算术扩展在某些特定情况下的工作原理:

  • 变量未设置或为空
  • 操作涉及另一个运算符而不是+或 -
  • 一美元用于扩展变量

当满足所有这些要求时,我得到错误:

  

语法错误:预期的操作数(错误令牌是......

以下是一些例子:

unset var   # or var=''
unset value

echo $(($var * 2)) # error
echo $(($var + 2)) # no error
echo $((var * 2))  # no error

var='value'
echo $(($var * 2)) # no error

为什么在第一个语句中var不会被所有其他语句中的0替换?

1 个答案:

答案 0 :(得分:7)

算术上下文中参数名称的扩展具有特殊属性。例如,在我们找到数值之前解析参数名称:

$ var1=5
$ var2=var1
$ echo $(( var2 ))
5

如果链结束,例如在上例中未定义var1,则结果为零:

$ unset var1
$ echo $(( var2 ))
0

直接使用参数名称也会扩展为零:

$ echo $(( var1 ))
0

即使没有任何东西扩展为零:

$ echo $(( ))
0

但使用$varvar之间存在差异:

$ unset var
$ echo $(( var * 1 ))
0
$ echo $(( $var * 1 ))
-bash: * 1 : syntax error: operand expected (error token is "* 1 ")

第一个扩展为0 * 1,但第二个扩展为 * 1,这是一个语法错误,因为*需要两个操作数。这是你的第一个例子。

您的第二个示例扩展为 + 2,这很好:+被解释为一元加号。正如您在问题中所假设的那样,它不会被零替换。

第三个和第四个都扩展为0 * 2,如上所示:像value这样的非整数值在算术上下文中被解释为零。