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

    gnosis of shell 深入理解shell编程

     

    利用命令替换获取函数p的返回值(由echo提供),而后利用 [ ] 进行判断
    在执行函数p的时候,没有因为exit 55 退出整个脚本,而是打印了pppppppp,所以据此判断shell中命令引用是开辟了一个新的shell进程来执行命令引用,所以命令引用中的exit不会影响到父shell

     

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

    gnosis of shell 深入理解shell编程

     

     直接用函数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

    gnosis of shell 深入理解shell编程

     

     函数返回值没有变量接收,直接打印了,exit code 为 55 ,取反后,为真
     

     

  2. 直接ps只会显示当和当前shell关联的进程和其父进程

    gnosis of shell 深入理解shell编程

     

     

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

    gnosis of shell 深入理解shell编程

     

     命令引用后在函数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"

    gnosis of shell 深入理解shell编程

     

     明显看到执行函数b的命令引用时,多出 21476 这个子shell进程,这个时候不能通过变量 $ 进行判断了

     

gnosis of shell 深入理解shell编程

上一篇:rocketmq linux 安装教程


下一篇:Zero to JupyterHub with Kubernetes @aliyun