chinaab 发表于 2018-8-29 10:05:12

bash之局部变量与子shell-wdejiyi1210

  shell是每个接触linux、unix用户不得不会的工具,谈到shell就又联系到bash,因为这个shell是普遍被使用的。那么bash中的局部变量和子shell你是否能熟练掌握呢?这里推荐一本学习bash必须读的书《高级Bash脚本编程指南》。
  1、局部变量
  顾名思义,局部变量就是在局部起作用的变量,用local内建命令定义。在函数定义中,没有明确定义为局部变量的变量是全局变量,如下
  # function defval(){
  > a=66
  > }
  # echo $a
  # defval
  # echo $a
  66
  变量a在函数外可以访问到,确定是全局变量。继续测试
  # function defval(){
  > local a=3
  > }
  # defval
  # echo $a
  66
  这里使用local定义局部变量a,但是在函数外却访问不到,输出的值仍然是前面我们赋的值
  在子shell中定义的变量也是局部变量
  # (a=3;echo $a)
  3
  # echo $a
  66
  这里最后输出的仍然是66,还是原来的值,即使没有使用local命令定义
  在管道中定义的变量也是局部变量
  # a=3|echo $a
  66
  # echo $a
  66
  可以看出两次输出的都是66,意味着每一个管道是一个子shell
  综上说明,在管道、子shell里只能读取全局变量的值,而不能修改,函数例外。
  2、子shell
  通常情况下我们在终端输入的命令会作为当前终端shell的子进程来运行,子shell的出现使得我们并行处理变成可能,看后面。
  创建子进程的方法如下
  a、通过小括号 ()
  在小括号中运行的命令就是在子shell中运行的
  # (echo;pstree)
  ├─sshd───sshd───bash───bash───pstree
  b、通过管道符 |
  管道符相连的命令也是在子shell中运行的
  c、外部命令
  外部命令也是在子shell中运行的
  3、并行执行程序
  # cat t.sh
  #!/bin/sh
  (cat /root/expr1|bc >> /root/rs) &
  (cat /root/expr2|bc >> /root/rs) &
  wait
  cat /root/rs
  # ./t.sh
  15
  40
  这里的wait会等待所有前面放入后台的进程执行完毕才开始运行
  Note:在脚本中内建命令比外部命令执行更快速,因为内建命令不需要fork出进程来执行。
  本文出自 “好运” 博客,请务必保留此出处http://haoyun.blog.51cto.com/2038762/1121988

页: [1]
查看完整版本: bash之局部变量与子shell-wdejiyi1210