bash之局部变量与子shell
2013-01-18 19:44
134 查看
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出进程来执行。本文出自 “好运” 博客,请务必保留此出处http://haoyun.blog.51cto.com/2038762/1121988
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出进程来执行。本文出自 “好运” 博客,请务必保留此出处http://haoyun.blog.51cto.com/2038762/1121988
相关文章推荐
- bash之局部变量与子shell(转载)
- bash之局部变量与子shell
- linux 父、子shell变量传递问题
- 接口变量final,异常放大权限缩小,成员内部类,局部内部类。
- [RedHat笔记]第二课:时间表示、帮助命令、文本查看命令、实现用户管理及权限、BASH、变量、脚本
- static全局变量和普通全局变量区别?static局部变量和普通局部变量区别?static函数和普通函数区别
- extjs 如何将局部的变量变为全局变量
- 其他文本处理命令以及bash变量中的一些字符串的处理方法
- 深入浅出理解局部、全局、静态、动态、外部变量
- Keil调试局部变量显示"not in scope"的问题解决
- crontab与bash环境变量不一致导致的无法定时执行任务~
- 局部变量太大导致栈溢出
- Linux中设置环境变量(-bash: snmpget: command not found)
- 配置Hadoop环境变量bash_profile
- BASH系列(4)―― BASH变量操作
- mac关于.bash_profile环境变量配置的问题
- UCOS局部变量、任务堆栈
- OC中局部变量,全局变量和成员变量
- 【C#】全局变量、全局静态变量、局部变量、局部静态变量的区别
- 解释局部变量、全局变量和静态变量的含义-联想笔试题