Shell(Bash)小括號和大括號用法及區別

2020-07-16 10:04:35
在介紹小括號和大括號的用法及區別之前,我們先解釋兩個概念:父 Shell 和子 Shell。

在 Bash 中,是可以呼叫新的 Bash 的,比如:

[[email protected] ~]# bash
[[email protected] ~]#

這時,可以通過 pstree 命令査看一下進程數,命令如下:

[[email protected] ~]# pstree
init──┬──abrt-dump-oops
…省略部分輸出
├─sshd──┬──sshd───bash───bash───pstree
…省略部分輸出

可以看到我們的命令都是通過 ssh 遠端服務連結的,在 ssh 中生成了第一個 Bash,就是父 Shell。因為我們剛剛執行了 Bash 命令,所以在第一個 Bash 中生成了第二個 Bash,這個 Bash 就是子 Shell,我們是在子 Shell 中執行命令 pstree 的。

關於父 Shell 和子 Shell,大家可以想象成在 Windows 中我們開啟了一個"cmd"字元操作終端,那麼 Windows 本身就是父 Shell,而"cmd"終端則是子 Shell;也可以理解為在一個操作介面中又開啟了一個操作介面。

知道了父 Shell 和子 Shell,我們接著解釋小括號和大括號的區別。如果用於一串命令的執行,那麼小括號和大括號主要區別在於:
  • () 執行一串命令時,需要重新開啟一個子 Shell 來執行。
  • {} 執行一串命令時,在當前 Shell 中執行。
  • () 和 {} 都是把一串命令放田括號裡面,並且命令之間用";"隔開。
  • () 最後一條命令可以不用分號。
  • {} 最後一條命令要用分號。
  • {} 的第一條命令和左括號之間必須有一個空格。
  • () 裡的各命令不必和括號有空格。
  • () 和 {} 中括號裡面的某條命令的重定向只影響該命令,但括號外的重定向則會影響到括號裡的所有命令。

下面舉幾個例子。

[[email protected] ~]# name=sc #在父 Shell 中定義 name 的值是 sc
[[email protected] ~]# (name=liming;echo $name)
liming
#如果用()括起來一串命令,那麼這些命令都可以執行
#給name變數重新賦值,但是這個值只在子Shell中
[[email protected] ~]# echo $name
sc
#父Shell中name的值還是sc,而不是liming
[[email protected] ~]#{ name=liming;echo $name;} liming
#但是用大括號來進行一串命令的執行時,name變數的修改是直接在父Shell中進行的
#注意大括號的格式
[[email protected] ~]# echo $name
liming
#name變數的值已經被修改了

其實在執行一串命令時,如果使用的是小括號,則這串命令所做的修改只在子 Shell 中生效,一旦命令執行結束,回到父 Shell 中,這個修改就會丟失;而如果使用的是大括號,則此串命令直接在父 Shell 中執行,命令執行結束後,修改依然會生效。