• bash之局部变量与子shell(转载)


    shell是每个接触linux、unix用户不得不会的工具,谈到shell就又联系到bash,因为这个shell是普遍被使用的。那么bash中的局部变量和子shell你是否能熟练掌握呢?这里推荐一本学习bash必须读的书《高级Bash脚本编程指南》。

     
    1、局部变量
    顾名思义,局部变量就是在局部起作用的变量,用local内建命令定义。在函数定义中,没有明确定义为局部变量的变量是全局变量,如下
    [root@vm3 ~]# function defval(){
    > a=66
    > }
    [root@vm3 ~]# echo $a

    [root@vm3 ~]# defval
    [root@vm3 ~]# echo $a
    66
    变量a在函数外可以访问到,确定是全局变量。继续测试
    [root@vm3 ~]# function defval(){
    > local a=3
    > }
    [root@vm3 ~]# defval
    [root@vm3 ~]# echo $a
    66
    这里使用local定义局部变量a,但是在函数外却访问不到,输出的值仍然是前面我们赋的值
     
    在子shell中定义的变量也是局部变量
    [root@vm3 ~]# (a=3;echo $a)
    3
    [root@vm3 ~]# echo $a
    66
    这里最后输出的仍然是66,还是原来的值,即使没有使用local命令定义
     
    在管道中定义的变量也是局部变量
    [root@vm3 ~]# a=3|echo $a
    66
    [root@vm3 ~]# echo $a
    66
    可以看出两次输出的都是66,意味着每一个管道是一个子shell
     
    综上说明,在管道、子shell里只能读取全局变量的值,而不能修改,函数例外。
     
    2、子shell
    通常情况下我们在终端输入的命令会作为当前终端shell的子进程来运行,子shell的出现使得我们并行处理变成可能,看后面。
    创建子进程的方法如下
    a、通过小括号 ()
    在小括号中运行的命令就是在子shell中运行的
    [root@vm3 ~]# (echo;pstree)
    ├─sshd───sshd───bash───bash───pstree
    b、通过管道符 |
    管道符相连的命令也是在子shell中运行的
    c、外部命令
    外部命令也是在子shell中运行的
     
    3、并行执行程序
    [root@vm3 ~]# cat t.sh
    #!/bin/sh

    (cat /root/expr1|bc >> /root/rs) &
    (cat /root/expr2|bc >> /root/rs) &
    wait
    cat /root/rs
    [root@vm3 ~]# ./t.sh
    15
    40
    这里的wait会等待所有前面放入后台的进程执行完毕才开始运行
     
    Note:在脚本中内建命令比外部命令执行更快速,因为内建命令不需要fork出进程来执行。
  • 相关阅读:
    android头像更换(实现拍照和从手机图片里选择两种形式)
    安卓开发实战-记账本APP(六)
    安卓开发实战-记账本APP(五)
    安卓开发实战-记账本APP(四)
    安卓开发实战-记账本APP(三)
    BaseAdapter的三种表达式分析,startActivityForResult的使用
    使用Bundle在Activity之间交换数据
    深入理解JVM-类加载器深入解析(3)
    深入理解java内存模型--读书笔记
    深入理解JVM-类加载器深入解析(2)
  • 原文地址:https://www.cnblogs.com/jjzd/p/6297031.html
Copyright © 2020-2023  润新知