zoukankan      html  css  js  c++  java
  • 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出进程来执行。
  • 相关阅读:
    乘坐飞机时,有什么事情是机长和机上工作人员不想让乘客知道的?
    北京有哪些被废弃的地方值得一看?推荐理由是什么?
    在读硕士或博士是如何养活自己的?
    怎样有效提高记忆力?
    北京值得去的、不为人知的景点(或展览馆、美术馆、公园)有哪些?
    你收藏了哪些藏品?
    如何抓到入侵网站的黑客?
    中国姓氏的区域性?
    python之入门,你好,中国
    Eclipse 内置浏览器
  • 原文地址:https://www.cnblogs.com/jjzd/p/6297031.html
Copyright © 2011-2022 走看看