有人能解释一下为什么我们在第三个命令中需要 $ 符号吗?为什么没有美元符号就不起作用
[kony@HOSTNAME test]$ var1=1
[kony@HOSTNAME test]$ var1=[ var1 + 1 ]
bash: var1: command not found...
[kony@HOSTNAME test]$ var1=$[ var1 + 1 ]
[kony@HOSTNAME test]$ echo $var1
2
答案1
var1=[ var1 + 1 ]
类似于var1=[ env
或LC_ALL=C date
。它由两部分组成:var1=[
是赋值,var1 + 1 ]
是带参数的命令。如果var1
可以运行,它将在其环境中运行var1
;变量的值将是[
。
但没有var1
命令,因此出现错误。
注意]
不需要任何打开[
。这些根本不是特殊的。如果你曾经看到过类似的命令,[ "$foo" -eq 1 ]
那么请记住它只是一个名为的命令,其[
参数是: 的扩展值$foo
,-eq
1
和 ]
(但这不适用于[[ "$foo" -eq 1 ]]
)。
如果是,var1=[ var1 + 1 ]
那么毫无联系在其中[
和]
之间。
要查看var1=[
这种情况下会发生什么,请运行以下代码:
var1=1
var1=[ sh -c 'echo "$var1"'
echo "$var1"
您将看到[
和1
。由于var1=[
前面提到的sh -c …
新 shell 在其环境中已经使用 运行var1
,因此值为[
。当被询问时,shell 将其变量扩展为[
。主 shell 中的 值var1
不受此影响。如果var1=[
是单独的命令(如var1=1
之前一样),它将影响主 shell 中的变量。
var1=$[ var1 + 1 ]
有所不同。它使用算术扩展的弃用形式$[…]
。现在我们应该使用而不是$((…))
。当你调用 时var1=$[ var1 + 1 ]
,首先发生扩展,然后将结果分配给变量。
为了方便起见,shell 不要求$(( ))
(或$[ ]
) 中的变量名以 为前缀$
。几乎任何看起来不像整数或运算符的东西都被假定为变量名。仍然使用$var1
也可以:
var1=$((var1+1))
# or
var1=$(($var1+1))
# if you run both then the variable value will increase by two