在v2ex看到一个问题:

允许在一个命令之前立即发生一个或多个变量赋值,这些赋值为跟随着的命令更改环境变量,这个赋值的影响是暂时的。 
那为什么: 
int=100 
int=10 echo $(($int - 10)) 
结果是 90 而不是 0

 其实是这样:

int=100 
int=10 echo $(($int - 10)) 
echo $int 

sh -x 输出: 
+ int=100 
+ int=10 echo 90 
90 
+ echo 100 
100 

----------------------------------------- 
int=100 
int=10 echo $((int=$int - 10)) 
echo $int 

sh -x 输出: 
+ int=100 
+ int=10 echo 90 
90 
+ echo 90 
90 

----------------------------------------- 
int=100 
xx=10 echo $((int=$int - 10)) 
echo $int 
echo $xx 

sh -x 输出: 
+ int=100 
+ xx=10 echo 90 
90 
+ echo 90 
90 
+ echo 

所以:

 int=100 
int=10 echo $(($int - 10)) 
echo int 
等同于: 
parent=100 
child=10 echo $(($parent-10)) 
echo $parent 

输出: 
+ parent=100 
+ child=10 echo 90 
90 
+ echo 100 
100 
-------------------------------------------- 

下面这行 

int=10 echo $(($int - 10)) 

其实是开了一个新的子环境,并且子环境可以访问全部父环境变量 
因为“允许在一个命令之前立即发生一个或多个变量赋值” 
所以先执行 echo 命令,然后做赋值 int=10 
其实这个 int 是子环境新建的一个变量,与主环境 int 是两个不同的变量 
换成 C 语言( linux 是 C 写的,所以设计思想往 C 靠拢): 

int num = 100; 
{ 
printf("%d\n",num-10); 
int num = 10; 
} 
printf("%d\n",num); 

输出: 
90 
100 

学过 C 的都应该知道,子作用域新建变量与父作用域变量重名时,子作用域变量会覆盖父作用域变量 
当子作用域结束时,子作用域变量被销毁,父作用域变量恢复可见状态,所以出现以上情况。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-02
  • 2022-12-26
  • 2021-10-06
  • 2022-02-25
  • 2021-11-11
猜你喜欢
  • 2022-12-23
  • 2022-01-28
  • 2022-01-17
  • 2022-01-22
  • 2021-11-22
  • 2021-08-23
  • 2022-12-23
相关资源
相似解决方案