zoukankan      html  css  js  c++  java
  • sh脚本变量赋值时同时执行命令时的环境问题

    在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
    ",num-10); 
    int num = 10; 
    } 
    printf("%d
    ",num); 
    
    输出: 
    90 
    100 
    

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

  • 相关阅读:
    观后感
    用户故事排球教练助手
    本周工作量
    本周个人作业
    个人工作量
    个人作业
    产品计划总结
    典型用户和场景总结
    排球比赛计分规则
    PowerShell ISE:Windows Server 2008 R2默认不安装
  • 原文地址:https://www.cnblogs.com/liuxuzzz/p/5937585.html
Copyright © 2011-2022 走看看