[shell]shell 中| && || () {} 用法以及shell的邏輯與或非

轉自:https://www.jianshu.com/p/617c1ee1e46eshell

| 運算符

管道符號,是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的輸出排序。

&& 運算符:

格式ruby

command1  && command2

&&左邊的命令(命令1)返回真(即返回0,成功被執行)後,&&右邊的命令(命令2)纔可以被執行;換句話說,「若是這個命令執行成功&&那麼執行這個命令」。
語法格式以下:bash

command1 && command2 && command3 ...
  1. 命令之間使用 && 鏈接,實現邏輯與的功能。
  2. 只有在 && 左邊的命令返回真(命令返回值 $? == 0),&& 右邊的命令纔會被執行。
  3. 只要有一個命令返回假(命令返回值 $? == 1),後面的命令就不會被執行。
  4. 示例1中,cp命令首先從root的家目錄複製文件文件anaconda-ks.cfg到 /data目錄下;執行成功後,使用 rm 命令刪除源文件;若是刪除成功則輸出提示信息"SUCCESS"。ui


     
    示例1.jpg

|| 運算符:

格式spa

command1 || command2 

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

  1. 命令之間使用 || 鏈接,實現邏輯或的功能。unix

  2. 只有在 || 左邊的命令返回假(命令返回值 $? == 1),|| 右邊的命令纔會被執行。這和 c 語言中的邏輯或語法功能相同,即實現短路邏輯或操做。code

  3. 只要有一個命令返回真(命令返回值 $? == 0),後面的命令就不會被執行。orm

  4. 示例2中,若是 dir目錄不存在,將輸出提示信息 fail 。blog


     
    示例2.jpg
  5. 示例3中,若是 dir 目錄存在,將輸出 success 提示信息;不然輸出 fail 提示信息。


     
    示例3.jpg

    6.下面是一個shell腳本中經常使用的||組合示例

echo $BASH |grep -q 'bash' || { exec bash "$0" "$@" || exit 1; } 系統調用exec是以新的進程去代替原來的進程,但進程的PID保持不變。所以,能夠這樣認爲,exec系統調用並無建立新的進程,只是替換了原來進程上下文的內容。原進程的代碼段,數據段,堆棧段被新的進程所代替。 

() 運算符:

若是但願把幾個命令合在一塊兒執行,shell提供了兩種方法。既能夠在當前shell也能夠在子shell中執行一組命令。
格式:

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


     
    示例4.jpg

{} 運算符:

若是使用{}來代替(),那麼相應的命令將在子shell而不是當前shell中做爲一個總體被執行,只有在{}中全部命令的輸出做爲一個總體被重定向時,其中的命令才被放到子shell中執行,不然在當前shell執行。
它的通常形式爲:

{ command1;command2;command3… }      注意:在使用{}時,{}與命令之間必須使用一個空格
  1. 示例5中,使用{}則在子shell中執行了打印操做


     


做者:shu_ke
連接:https://www.jianshu.com/p/617c1ee1e46e
來源:簡書
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

&& 運算符:

格式

command1  && command2

&&左邊的命令(命令1)返回真(即返回0,成功被執行)後,&&右邊的命令(命令2)纔可以被執行;換句話說,「若是這個命令執行成功&&那麼執行這個命令」。
語法格式以下:

command1 && command2 && command3 ...
  1. 命令之間使用 && 鏈接,實現邏輯與的功能。
  2. 只有在 && 左邊的命令返回真(命令返回值 $? == 0),&& 右邊的命令纔會被執行。
  3. 只要有一個命令返回假(命令返回值 $? == 1),後面的命令就不會被執行。
  4. 示例1中,cp命令首先從root的家目錄複製文件文件anaconda-ks.cfg到 /data目錄下;執行成功後,使用 rm 命令刪除源文件;若是刪除成功則輸出提示信息"SUCCESS"。


     
    示例1.jpg

|| 運算符:

格式

command1 || command2 

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

  1. 命令之間使用 || 鏈接,實現邏輯或的功能。

  2. 只有在 || 左邊的命令返回假(命令返回值 $? == 1),|| 右邊的命令纔會被執行。這和 c 語言中的邏輯或語法功能相同,即實現短路邏輯或操做。

  3. 只要有一個命令返回真(命令返回值 $? == 0),後面的命令就不會被執行。

  4. 示例2中,若是 dir目錄不存在,將輸出提示信息 fail 。


     
    示例2.jpg
  5. 示例3中,若是 dir 目錄存在,將輸出 success 提示信息;不然輸出 fail 提示信息。


     
    示例3.jpg

    6.下面是一個shell腳本中經常使用的||組合示例

echo $BASH |grep -q 'bash' || { exec bash "$0" "$@" || exit 1; } 系統調用exec是以新的進程去代替原來的進程,但進程的PID保持不變。所以,能夠這樣認爲,exec系統調用並無建立新的進程,只是替換了原來進程上下文的內容。原進程的代碼段,數據段,堆棧段被新的進程所代替。 

() 運算符:

若是但願把幾個命令合在一塊兒執行,shell提供了兩種方法。既能夠在當前shell也能夠在子shell中執行一組命令。
格式:

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


     
    示例4.jpg

{} 運算符:

若是使用{}來代替(),那麼相應的命令將在子shell而不是當前shell中做爲一個總體被執行,只有在{}中全部命令的輸出做爲一個總體被重定向時,其中的命令才被放到子shell中執行,不然在當前shell執行。
它的通常形式爲:

{ command1;command2;command3… }      注意:在使用{}時,{}與命令之間必須使用一個空格
  1. 示例5中,使用{}則在子shell中執行了打印操做


     

shell的邏輯與或非

    邏輯非 !               條件表達式的相反
if [ ! 表達式 ]
if [ ! -d $num ]        若是不存在目錄$num
 
    邏輯與 –a              條件表達式的並列
if [ 表達式1  –a  表達式2 ]
 
    邏輯或 -o               條件表達式的或
if [ 表達式1  –o 表達式2 ]
  •     表達式與前面的=  != -d –f –x -ne -eq -lt等合用
  •     邏輯符號就正常的接其餘表達式,沒有任何括號( ),就是並列
if [ -z "$JHHOME" -a -d $HOME/$num ]
  •     注意邏輯與-a與邏輯或-o很容易和其餘字符串或文件的運算符號搞混了
做者:shu_ke連接:https://www.jianshu.com/p/617c1ee1e46e來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索