shell脚本【符号3】“ | ” :管道 / case结构中的“或”

本篇博客将会介绍符号 | 的两种作用:

    一、是作为管道

    二、是case语句块中的或操作

使用1:管道

       管道是一种先进先出的单向数据通路。  

       作用:利用管道符号“|”,把一个命令的标准输出连接到另一个命令的标准输入。简单点说,就是把前一个命令的标准输出,作为下一个命令的标准输入传入。不过,管道只能处理标准输出,而不能处理标准错误输出。

       重点:标准输出和标准输入。什么是标准输出,什么是标准输入,别和其它的弄混了:点击打开链接


    比如这个例子:

      sum101脚本代码: echo $1      执行命令:./sum100  |  bash sum101

    分析:这一个命令没有输出,sum100脚本的标准输出5050无法作为sum101脚本的输入参数。

    我需要知道的是,管道传递的是什么数据;还有sum101接入参数为什么不能正常接入?

       答:管道传递的是前一个命令的标准输出,用于后一个命令的标准输入。而这个前提是后一个命令需要接收标准输入。而sum101脚本中,并没有接收标准输入的命令语句。

疑问与解答:

    问1为什么有的命令可以接收管道传过来的数据,比如wc命令,有的命令接收不了,比如echo命令。

      答:管道会将前面命令的标准输出当做后面的标准输入,也就说,前一个命令需要有标准输出,而后一个命令需要能够接受标准输入。而命令认STDIN的,或者认-参数的,才能使用管道;不认的,只能使用xargs,把前面的输出补到后面命令的尾巴上,当做参数。

      问2用管道传输数据时,两边的命令有什么限制,管道传输的是什么数据?

      答:前一个命令需要有标准输出,后一个命令需要能够接受标准输入。

    问3如果前一个命令没有标准输出,后一个命令会怎样?

    答:这个不同的shell处理会有不同。在bash中,即便没有标准输入,后面程序仍然会继续执行,但不会获得任何输入。所以,后一个程序会执行。另外,一般整个管道的返回状态是最后一个命令的退出状态。

      问4管道符中加xargs和不加xargs的区别,以及xargs与exec的区别

    管道符后不加xargs,相当于先把“|”前命令的标准输出内容作为后一个命令的标准输入。

    管道符后加上xargs,相当于在命令输入时直接把“管道符前面命令执行结果的字符串”,加到管道符后面命令后面,作为其参数。

       xargs与管道|的区别:

        | 用来将前一个命令的标准输出传递到下一个命令的标准输入,xargs 将前一个命令的标准输出传递给下一个命令作为它的参数。

        xargs与exec的区别:

    (1)exec参数是一个一个传递的,传递一个参数执行一次命令;xargs一次将参数传给命令,可以使用-n控制参数个数

    (2)exec文件名有空格等特殊字符也能处理;xargs不能处理特殊文件名,如果想处理特殊文件名需要特殊处理

       问5常用命令可以直接用于管道命令(接收标准输入),主要有:

       cat、cut、cpio、grep、sed、gawk、sort、uniq、wc、tee、tr、col、join、paste、expand、xargs   在脚本中还有read命令可以接收标准输入(read命令不接收参数的传入)。

                比如,脚本test代码:read a b c  ;  echo $b    执行命令:bash test 4 5 6   这个“4 5 6”参数是不会被read接收的。

        问6Shell函数、shell脚本可不可以用管道命令?

        当然可以!!

        问7shell函数和shell脚本执行的最后是不是只有return数据和exit数据,还是说Shell函数和shell脚本中命令语句的输出也是shell函数和shell脚本输出的一部分?

       答:return和exit是程序成功与否的出口状态信息,而不是标准输出信息,所以不会显示,也不可能通过管道传递。

              shell函数和shell脚本中的任何标准输出都是其标准输出的一部分。

 

使用2:作为case参数选择的‘或’操作 P219

        Shell函数中case分支语句的结构:

        case “$variable” in

                partern1)

                        command-list ;;

                partern2)

                        command-list ;;

                partern3)

                        command-list ;;

                ……

                esac

    分析:parternN中可以使用单个元素,也可以使用运算符“|”,表示多个模式的逻辑或关系。

      举例:

      功能:实现case语句块中“|”的检测

    脚本文件:sum101

      代码:

            case "$1" in

                   a)echo a          ;;

                   2|1)   echo right   ;;

                   1 | 2) echo error    ;;

                   *) echo what ;;

           esac

      执行命令:bash sum101 1        (“1”是传入参数)

    输出结果:right

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页