Bash 脚本中的变量

Bash 脚本中的变量

有人能解释一下为什么我们在第三个命令中需要 $ 符号吗?为什么没有美元符号就不起作用

[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=[ envLC_ALL=C date。它由两部分组成:var1=[是赋值,var1 + 1 ]是带参数的命令。如果var1可以运行,它将在其环境中运行var1;变量的值将是[

但没有var1命令,因此出现错误。

注意]不需要任何打开[。这些根本不是特殊的。如果你曾经看到过类似的命令,[ "$foo" -eq 1 ]那么请记住它只是一个名为的命令,其[参数是: 的扩展值$foo-eq1 ](但这不适用于[[ "$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

相关内容