shell是每一個接觸linux、unix用戶不得不會的工具,談到shell就又聯繫到bash,由於這個shell是廣泛被使用的。那麼bash中的局部變量和子shell你是否能熟練掌握呢?這裏推薦一本學習bash必須讀的書《高級Bash腳本編程指南》。linux
一、局部變量shell
顧名思義,局部變量就是在局部起做用的變量,用local內建命令定義。在函數定義中,沒有明肯定義爲局部變量的變量是全局變量,以下編程
[root@vm3 ~]# function defval(){
> a=66
> }
[root@vm3 ~]# echo $a
[root@vm3 ~]# defval
[root@vm3 ~]# echo $a
66bash
變量a在函數外能夠訪問到,肯定是全局變量。繼續測試ssh
[root@vm3 ~]# function defval(){
> local a=3
> }
[root@vm3 ~]# defval
[root@vm3 ~]# echo $a
66ide
這裏使用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裏只能讀取全局變量的值,而不能修改,函數例外。
二、子shell
一般狀況下咱們在終端輸入的命令會做爲當前終端shell的子進程來運行,子shell的出現使得咱們並行處理變成可能,看後面。
建立子進程的方法以下
a、經過小括號 ()
在小括號中運行的命令就是在子shell中運行的
[root@vm3 ~]# (echo;pstree)
├─sshd───sshd───bash───bash───pstree
b、經過管道符 |
管道符相連的命令也是在子shell中運行的
c、外部命令
外部命令也是在子shell中運行的
三、並行執行程序
[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