您的位置:首页 > 运维架构 > Shell

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

2017-01-18 15:55 260 查看
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出进程来执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: