| 運算子

管道符號,是unix一個很強大的功能,符號為一條豎線:”|”。

用法:

command 1 | command 2

他的功能是把第一個命令command 1執行的結果作為command2的輸入傳給command 2。

例如:

$ls -s|sort -nr (請注意不要複製$符號進去哦)

-s 是 file size,-n 是 numeric-sort,-r 是 reverse,反轉
該命令列出當前目錄中的文件(含size),並把輸出送給sort命令作為輸入,sort命令按數字遞減的順序把ls的輸出排序。

&& 運算子

用法:

command1  && command2

&&左邊的命令(命令1)返回真(即返回0,成功被執行)後,&&右邊的命令(命令2)才能夠被執行;換句話說,“如果這個命令執行成功&&那麼執行這個命令”。

語法格式如下:

command1 && command2 && command3 ...
  1. 命令之間使用 && 連線,實現邏輯與的功能。
  2. 只有在 && 左邊的命令返回真(命令返回值 $? == 0),&& 右邊的命令才會被執行。
  3. 只要有一個命令返回假(命令返回值 $? == 1),後面的命令就不會被執行。

這裡寫圖片描述
上面圖示中,cp 命令首先從 root 的根目錄複製檔案檔案 anaconda-ks.cfg 到 /data目錄下;執行成功後,使用 rm 命令刪除原始檔;如果刪除成功則輸出提示資訊”SUCCESS”。

|| 運算子:

格式:

command1 || command2

|| 則與 && 相反。如果 || 左邊的命令(command1)未執行成功,那麼就執行 || 右邊的命令(command2);或者換句話說,“如果這個命令執行失敗了 || 那麼就執行這個命令。

  1. 命令之間使用 || 連線,實現邏輯或的功能。
  2. 只有在 || 左邊的命令返回假(命令返回值 $? == 1),|| 右邊的命令才會被執行。這和 c 語言中的邏輯或語法功能相同,即實現短路邏輯或操作。
  3. 只要有一個命令返回真(命令返回值 $? == 0),後面的命令就不會被執行。

這裡寫圖片描述
上面圖示中,如果 dir目錄不存在,將輸出提示資訊 fail 。

這裡寫圖片描述
上面圖示中,如果 dir 目錄存在,將輸出 success 提示資訊;否則輸出 fail 提示資訊。

下面是一個 shell 指令碼中常用的 || 組合示例

echo $BASH |grep -q 'bash' || { exec bash "$0" "[email protected]" || exit 1; }

系統呼叫 exec 是以新的程序去代替原來的程序,但程序的 PID 保持不變。因此,可以這樣認為,exec 系統呼叫並沒有建立新的程序,只是替換了原來程序上下文的內容。原程序的程式碼段,資料段,堆疊段被新的程序所代替。

() 運算子

如果希望把幾個命令合在一起執行,shell提供了兩種方法。既可以在當前shell也可以在子shell中執行一組命令。
格式:

(command1;command2;command3....)               # 多個命令之間用 ; 分隔
  1. 一條命令需要獨佔一個物理行,如果需要將多條命令放在同一行,命令之間使用命令分隔符(;)分隔。執行的效果等同於多個獨立的命令單獨執行的效果。
  2. () 表示在當前 shell 中將多個命令作為一個整體執行。需要注意的是,使用 () 括起來的命令在執行前面都不會切換當前工作目錄,也就是說命令組合都是在當前工作目錄下被執行的,儘管命令中有切換目錄的命令。
  3. 命令組合常和命令執行控制結合起來使用。

這裡寫圖片描述
上面圖示中,如果目錄dir不存在,則執行命令組合。

{} 運算子

如果使用 {} 來代替 (),那麼相應的命令將在子 shell 而不是當前 shell 中作為一個整體被執行,只有在 {} 中所有命令的輸出作為一個整體被重定向時,其中的命令才被放到子 shell 中執行,否則在當前 shell 執行。
它的一般形式為:

{ command1;command2;command3… } 

注意:在使用 {} 時,{} 與命令之間必須使用一個空格

這裡寫圖片描述
上面圖示中,使用 {} 在子 shell 中執行了列印操作

shell的邏輯與或非

邏輯非 ! 條件表示式的相反

if [ ! 表示式 ]
if [ ! -d $num ]        如果不存在目錄$num

邏輯與 –a 條件表示式的並列

if [ 表示式1a  表示式2 ]

邏輯或 -o 條件表示式的或

if [ 表示式1  –o 表示式2 ]
    表示式與前面的=  != -d –f –x -ne -eq -lt等合用
    邏輯符號就正常的接其他表示式,沒有任何括號( ),就是並列
if [ -z "$JHHOME" -a -d $HOME/$num ]
    注意邏輯與-a與邏輯或-o很容易和其他字串或檔案的運算子號搞混了
.