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出进程来执行。
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
- bash之局部变量与子shell
- [转载]LCC编译器的源程序分析(21)局部变量的声明
- (转载)static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- bash 脚本编程七 将命令输出保存到变量中(转载)
- 返回指向局部变量的指针或引用
- 安装Android SDK时,点击SDK Manager.exe闪退,并且jdk的环境变量是对的。(转载)
- Linux bash Shell中的变量类型详解
- Linux如何修改env看到的环境变量? .bashrc和.bash_profile区别
- Bash中的变量类型
- linux shell bash 内置变量参考
- 《转载》什么变量在堆内存里存放,什么变量在栈内存里存放
- 转载一篇对php变量名的问题,很有意思,之前没注意过
- Ubuntu设置环境变量并生效[转载]
- static全局变量与普通全局变量的区别?static局部变量与普通局部变量的区别?static全局函数与普通全局函数的区别?
- C语言,全局变量、静态全局变量、静态局部变量、局部变量的区别
- T-SQL-注释、变量 (转载)
- 栈(stack)与堆(heap)区别以及Java的string变量赋值的内部工作机制(精典转载贴)
- Java的局部内部类以及final类型的参数和变量
- 全局变量、静态全局变量、静态局部变量和局部变量