我无法理解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替换?
答案 0 :(得分:7)
算术上下文中参数名称的扩展具有特殊属性。例如,在我们找到数值之前解析参数名称:
$ var1=5
$ var2=var1
$ echo $(( var2 ))
5
如果链结束,例如在上例中未定义var1
,则结果为零:
$ unset var1
$ echo $(( var2 ))
0
直接使用参数名称也会扩展为零:
$ echo $(( var1 ))
0
即使没有任何东西扩展为零:
$ echo $(( ))
0
但使用$var
和var
之间存在差异:
$ 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
这样的非整数值在算术上下文中被解释为零。