本篇博客将会介绍符号 | 的两种作用:
一、是作为管道
二、是case语句块中的或操作
管道是一种先进先出的单向数据通路。
作用:利用管道符号“|”,把一个命令的标准输出连接到另一个命令的标准输入。简单点说,就是把前一个命令的标准输出,作为下一个命令的标准输入传入。不过,管道只能处理标准输出,而不能处理标准错误输出。
重点:标准输出和标准输入。什么是标准输出,什么是标准输入,别和其它的弄混了:点击打开链接
比如这个例子:
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接收的。
问6:Shell函数、shell脚本可不可以用管道命令?
当然可以!!
问7:shell函数和shell脚本执行的最后是不是只有return数据和exit数据,还是说Shell函数和shell脚本中命令语句的输出也是shell函数和shell脚本输出的一部分?
答:return和exit是程序成功与否的出口状态信息,而不是标准输出信息,所以不会显示,也不可能通过管道传递。
shell函数和shell脚本中的任何标准输出都是其标准输出的一部分。
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