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出进程来执行。

bash之局部变量与子shell(转载)的更多相关文章

  1. 进入子shell的各种情况分析

    子shell的概念贯穿整个shell,写shell脚本时更是不可不知.所谓子shell,即从当前shell环境新开一个shell环境,这个新开的shell环境就称为子shell(subshell),而 ...

  2. 子shell以及什么时候进入子shell

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 子shell的概念贯穿整个shell,写shell脚本时更是不 ...

  3. Linux Shell编程(27)——子shell

    运行一个shell脚本时会启动另一个命令解释器. 就好像你的命令是在命令行提示下被解释的一样, 类似于批处理文件里的一系列命令.每个shell脚本有效地运行在父shell(parent shell)的 ...

  4. 子shell

    http://bbs.csdn.net/topics/392292455 https://www.cnblogs.com/daniaoge/p/6161821.html http://blog.csd ...

  5. 统计文件种类数+获取子shell返回值的其它方法

    前言 只是作为一个shell的小小练习和日常统计用,瞎折腾的过程中也是摸到了获取子shell返回值的几种方法: 肯定还有别的方法,跟进程间的通信相关,希望你能提出建议和补充,谢谢~ 完整程序: #! ...

  6. 命令行子shell 括号 ()

    子shell 控制变量 ansible-direc:~ # (export hello=world;echo $hello)worldansible-direc:~ # echo $hello ans ...

  7. Linux编程 9 (shell类型,shell父子关系,子shell用法)

    一. shell类型 1.1  交互式 bin/ shell程序 当用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器时,默认的shell程序就会开始运行.系统启动什么样的shell程序取决于你 ...

  8. Linux中shell和子shell一点点理解

    Linux执行脚本有两种方式,主要区别在于是否建立子shell   1.像sh,bash,./命令是用来执行shell脚本的,在bash/sh命令下,脚本文件可以无"执行权限",即 ...

  9. linux 子shell subshell和函数

    关于子shell, subshell 参考:http://blog.csdn.net/sosodream/article/details/5683515 系统引导时的进程为 "原始进程&qu ...

随机推荐

  1. 前端如何接收 websocket 发送过来的实时数据

    WebSocket protocol 是HTML5一种新的协议,它实现了浏览器与服务器全双工通信(full-duple).刚开始的握手需要借助HTTP请求完成,在 WebSocket API,浏览器和 ...

  2. java学习笔记10--泛型总结

    java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5-- ...

  3. Android -- sqlite数据库随apk发布

    背景                                                                                            把在工程中测 ...

  4. Mysql触发器、模糊查找、存储过程、内置函数

    原本觉得Mysql的一些知识还是差不多了,但是在实际上在项目上用的时候,发现什么都忘记了.现在重新回顾一下,顺便做个笔记. 触发器                                    ...

  5. Tensorflow 深度学习简介(自用)

    一些废话,也可能不是废话.可能对,也可能不对. 机器学习的定义:如果一个程序可以在任务T上,随着经验E的增加,效果P也可以随之增加,则称这个程序可以在经验中学习. “程序”指的是需要用到的机器学习算法 ...

  6. ARC和非ARC在项目中转换

    f your project doesn't use ARC: you must add the -fobjc-arc compiler flag to SVHTTPRequest.m andSVHT ...

  7. (step6.1.1)hdu 1879(继续畅通工程——最小生成树、kruscal)

    题目大意:输入一个整数n,表示有n个村庄.在接下来的n(n-1)/2行中,每行有4个整数begin  end  weight  flag.分别表示从begin到end之间可以连通 ,他们之间的费用为w ...

  8. Android研究之为基于 x86 的 Android* 游戏选择合适的引擎具体解释

     摘要 游戏开发者知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中.它们所占的比例超过 90% ...

  9. php 命令行方式运行时 几种传入参数的方式

    1. url方式 $param = array(); if ($argc > 1) { parse_str ( $argv [1], $param ); foreach ( $param as ...

  10. 一款基于SSM框架技术的全栈Java web项目(已部署可直接体验)

    概述 此项目基于SSM框架技术的Java Web项目,是全栈项目,涉及前端.后端.插件.上线部署等各个板块,项目所有的代码都是自己编码所得,每一步.部分都有清晰的注释,完全不用担心代码混乱,可以轻松. ...