Linux Chaining Operators顾名思义,就是连接命令的操作,有些时候,往往一些命令可以用一行命令代替,我们就不需要大动干戈再去写Shell Script了,掌握和学习这些Chaining Operatos可以让你的学习和生活事半功倍,今天,我就给大家介绍一些,我个人觉得有用的tricks.
1.先给大家来个重量级的非操作-- ! ,对,就是C++中的非操作,可能很多人跟我一样以前没怎么用过非操作在shell里,我先给大家看个demo
touch a.txt b.txt c.txt d.txt e.txt f.txt
首先我们创建了6个txt,有时候会有需求说我只需要留下c.txt,其他的我都不要,我一开始比较笨的方法可能是先把c.txt移走,然后再整个删除文件夹。这个时候真正有用的非操作就来了。我们只需要
rm !(c.txt)
即把除了c.txt之外的其他txt都给删除了,同样,非操作也使用于适配符,比如
touch a.txt b.txt c.txt d.html e.html
我们想留下所有的html,其实只需要
rm !(*.txt)
就可以了 。
2.后台命令 & -- 有时候需要程序后台进行,即让firefox输入之后不要阻塞当前shell,这样你可以继续执行别的命令
firefox &
3. 分号操作符 ; -- 当我们希望在一行上执行多个命令的时候我们可以利用;来将这些命令连起来,但这个时候要注意,它不会根据前面的命令成功与失败来判断,要根据判断参考下文
touch a.txt; cat a.txt
此时虽然touch和cat是连续执行,但如果你touch失败,cat还是会执行下去,要用到确认前面结果我们可以用下面的连接符。
4. 与操作符 && -- 当我们希望第一个命令必须执行成功之后,再执行第二个命令的时候,我们就可以用到这个命令
touch a.txt && cat a.txt
只有在touch成功返回0的时候,我们才继续执行a.txt
5. 或操作符 || -- 同样有验证失败的操作符,即在前一个命令运行失败之后我后面的命令才执行
cd temp || mkdir temp
如果我cd temp失败了,说明当前路径没有temp文件夹,这个时候我再进行创建temp操作。
6. 与或操作符 && || -- 可以达成我们C语言中if...else...的效果
cd temp && cat a.txt || mkdir temp
进入temp,成功就获取a.txt,失败就先创建temp
7. 大括号 {} -- 有时候,我们希望一组命令成对执行,即包括在统一的逻辑判断中,不需要分开来
[ -f /opt/a.txt ] || echo “The file does not exist”; touch /opt/a.txt
如果我们这么写,那么,如论a.txt是否存在,我的touch都会执行,所以我们可以用大括号来进行操作
[ -f /opt/abc.txt ] || { echo “The file does not exist”; touch /opt/abc.txt; }
这样只有在a.txt成功之后,我后面的两个命令才会执行,即把他们封装成了一个集合体,注意:类似于这种集合语句的封装除了用大括号之外也可以用小括号(),但两者还是有区别的,首先,如果你要用大括号,你大括号中最后一个命令的后面必须有个非号,其次你要保证大括号的头都预留一个空格出来(尾不强求),不然bash会报错。而小括号没有这个限制。另外一点,用小括号运行的命令会集中进入sub-shell,即子shell执行,这个时候你在子shell中修改了环境变量等等,都不会改变当前shell的环境变量。而如果你用的大括号,即在当前shell环境下修改了环境变量,会直接影响到当前的父环境(也可以参考,当修改了bashrc之后,用source或者.会立即起作用,而用./脚本名或者sh操作只会创建子进程执行而不会影响当前父shell的环境变量)
8. 小括号() -- 优先权操作符,除了上面讲到的封装的一个逻辑体之外,()还有一个优先权操作符的功能
command1 && command2 || command3 && command4
当command1执行成功之后只会执行command2,此时command3和command4的并不会执行,如果不想浪费时间,比如,只要command1失败了,我后面的command3和command4就不想执行了,只需要
( caommand1 && command2 ) || ( command3 && command4 )
即可完成这种效果。注意:也可以用大括号,但必须注意空格和分好问题
{ caommand1 && command2;} || { command3 && command4;}
同时也需要跟上文一样考虑,sub-shell和当前shell,小括号和大括号区别的问题。
9. 斜杠 -- 当用户命令输入过程时可以用到这个操作符
touch a.txt echo "Hello" > a.txt
10. 管道符 | -- 这个操作符相信大家都非常熟悉了,就是把前一个命令的输出结果作为下一个命令的输入结果
ls | grep test
这就是Ricky给大家带来的China Operators用法,希望大家会喜欢这篇文章,留下你的脚印,给我点鼓励,谢谢。
参考链接:1. http://www.tecmint.com/chaining-operators-in-linux-with-practical-examples/
2. http://www.linuxnix.com/2012/07/23-awesome-less-known-linuxunix-command-chaining-examples.html
3. 鸟哥的Linux私房菜 基础学习篇