1. 程式人生 > 實用技巧 >gnosis of shell 深入理解shell程式設計

gnosis of shell 深入理解shell程式設計

  

  1. shell中if while等後必須接命令,利用命令的exit code作為判斷,而其他高階語言是利用return值作為判斷
    對於非命令變數,可以利用test or [ ] or [[ ]] 進行判斷
    如果確實需要用命令或函式的返回值作為判斷,可以如下
    function p(){
        echo $$
        exit 55
    }
    
    if ! [ `p` ];then
        echo bbbb
    else
        echo pppppppppppp
    fi

    利用命令替換獲取函式p的返回值(由echo提供),而後利用 [ ] 進行判斷
    在執行函式p的時候,沒有因為exit 55 退出整個指令碼,而是列印了pppppppp,所以據此判斷shell中命令引用是開闢了一個新的shell程序來執行命令引用,所以命令引用中的exit不會影響到父shell

    function p(){
        echo $$
        exit 55
    }
    
    if ! p;then
        echo bbbb
    else
        echo pppppppppppp
    fi

    直接用函式p的exit code : 55進行判斷,但是函式p中包含了exit,結束了當前shell程序,所以整個shell指令碼退出了,故此種方式函式p的執行是在當前shell程序,跟命令引用是不同的
    所以改為return



    function p(){
        echo $$
        return 55
    }
    
    if ! p;then
        echo bbbb
    else
        echo pppppppppppp
    fi

    函式返回值沒有變數接收,直接列印了,exit code 為 55 ,取反後,為真

  2. 直接ps只會顯示當和當前shell關聯的程序和其父程序

  3. function b(){
        echo $$
        exit 55
    }
    
    echo 'current shell PID: '$$
    
    p=`b`
    
    echo
    echo 'function b PID: '$p
    echo 
    
    "ps"

    命令引用後在函式b中$$依然為 20933,難道命令引用沒有開闢子shell嗎?
    $ 擴充套件為shell的程序ID。在一個()子shell,它擴充套件為當前shell的程序ID,而不是子shell。



    shell中的函式凡是輸出stdout & stderr的都是返回值,也可以利用echo明確返回

    看如下例子:

    function b(){
        "ps"
        exit 55
    }
    
    echo 'current shell PID: '$$
    
    p="`b`"
    
    echo
    echo -e 'function b ps result: \n'"$p"
    echo 
    
    "ps"

    明顯看到執行函式b的命令引用時,多出 21476 這個子shell程序,這個時候不能通過變數 $ 進行判斷了