## 子Shell
子Shell或者叫子進程,是從父子進程的概念出發的,UNIX操作系統的進程從init進程開始其他均有其對應的子進程,就算是由于父進程先行結束導致的孤兒進程,也會被init領養使其父進程ID為1。在Bash中 通常會通過以下幾種形式產生子進程:
* &,提交后臺作業
* \|,管道
* \(\),操作符
* 外部命令
需要注意的是,在寫Bash腳本過程中推薦_\*\*_使用Bash內建\(builtin\)命令,因為外部命令會forks一個子進程效率并不是很高,我們來看以下測試案例:
```
[root@blog.puppeter.com_centos ~]# time for i in `seq 1 1000`;do result=$(expr length $test);done
real 0m0.764s
user 0m0.437s
sys 0m0.323s
[root@blog.puppeter.com_centos ~]# time for i in `seq 1 1000`;do result={#test} ;done
real 0m0.005s
user 0m0.005s
sys 0m0.000s
```
案例主要是測試test字符串的長度。第一個案例調用了外部命令,第二個命令是調用內部命令可以看到最終的執行結果性能相差100倍之多,所以推薦在編寫腳本過程中盡量使用內建命令。
### 子Shell案例
#### 案例1
使用\(\)操作符來創建子進程。
```
#!/bin/bash
echo "Father Shell is: $BASH_SUBSHELL" # 打印父Shell的層次,為0
outervar=OUTER # 父Shell的變量outervar
( # 利用圓括號結構創建子Shell
echo "SubShell is: $BASH_SUBSHELL" # 子Shell的層次為1
(
echo "GrandSubShell is: $BASH_SUBSHELL" # 孫Shell的層次為2
)
innervar=INNER # 子Shell的變量
echo "innervar=$innervar"
echo "outervar=$outervar" # outervar繼承了符Shell所賦給它的值
) # 回到父shell
echo "Father Shell is: $BASH_SUBSHELL"
if [ -z "$innervar" ] # 子Shell中定義變量為空,則說明并沒有獲取子Shell中變量
then
echo "The \$innervar is not defined in main body."
else
echo "The \$innervar is defined in main body."
fi
```
#### 案例2
通過管道\| ,& 和()方式組成命令組并實現并發執行的效果,譬如以下這個案例:
```
#!/bin/bash
(grep -r "root" /etc/* | sort > part1) & # 與root關鍵字匹配的行,排序后輸出到某文件
(grep -r "root" /usr/local/* | sort > part2) &
(grep -r "root" /lib/* | sort > part3) &
wait # 等待后臺執行的作業全部完成
cat part1 part2 part3 | sort > parttotal
echo "Run time of this script is:$SECONDS" # 輸出該腳本執行時間
```
#### 案例3
有的同學也會關心\(\)和{}操作符的區別,其實他們都是對命令組執行:
相同點:
* \(\)和{}都是把一串的命令放在括號里面,并且命令之間用;號隔開執行
不同點:
* \(\)只是對一串命令重新開一個子Shell進行執行,{}對一串命令在當前Shell執行
* \(\)最后一個命令可以不用分號,{}最后一個命令要用分號
> 注意: 在使用{}時,{}與命令之間必須使用一個空格
看以下案例。
```
[root@blog.puppeter.com_centos ~]# A=1;echo $A;{ A=2; };echo $A
1
2
[root@blog.puppeter.com_centos ~]# A=1;echo $A;(A=2);echo $A
1
1
```
- Introduction
- 1.Shell編程基礎
- 什么是Shell
- 編寫第一個Bash程序
- 2.變量
- 什么是變量
- 變量四種賦值方式
- 指定變量類型
- 變量的類型
- 特殊變量
- 3.Bash符號相關
- Bash符號相關
- 特殊符號
- 數學運算符號
- 4.內建命令與外部命令
- 內建命令與外部命令
- 5.read命令
- read命令
- 6.條件語句
- if..then..fi
- if..then..else..fi
- if..then..elif..fi
- 空命令
- 文件測試符
- 字符串判斷、與、或和非
- []與[[]]符號
- 7.Bash循環 && 分支語句
- while循環語句
- for循環
- for..in循環
- until循環
- select循環
- case分支語句
- 8.正則表達式
- 正則表達式
- 9.子Shell和受限Shell
- 子Shell
- 受限Shell
- 10.函數與函數的加載
- 函數語法與案例
- 遞歸函數
- 函數的加載
- 11.Bash腳本風格
- Bash腳本風格
- 12.Bash腳本調試
- Bash腳本調試
- 13.sed && awk
- sed
- 14.awk
- awk
- 15 Bash雜項 && 案例
- while循環的陷阱
- Bash的生命周期
- IO重定向
- /bin/bash和/bin/sh區別
- 命令雜項
- Shell加密
- 16.10.2.案例
- Bash版回收站
- 17.Bash中文速查表
- 中文速查表