欢迎转载,转载请注明原地址:
http://blog.csdn.net/u013190088/article/details/65445500
命令执行判断依据(’;’、’&&’、’||’)
如果我们想要一次输入去执行很多指令,而不想分次执行时,一般有两个选择:
①shell script撰写脚本去执行
②透过【;】、【&&】、【||】
1、 cmd;cmd(不考虑指令相关性的连续指令下达)
有些时候,我们希望可以一次执行多条指令,比如在关机的时候可以先执行两次sync同步化写入磁盘后才shutdown计算机,那么我们可以这么写:
sync;sync;shutdown -h now
在指令中间利用【;】隔开,这样一来,分号前的指令执行完毕之后就会立即执行后边的指令。可是呢…..
如果我们想要在某一个目录下面建立一个档案,也就是说目录存在的话就建立这个档案,如果目录不存在,那就算了。也就是说这两个指令彼此之间是有相关性的,前一个指令是否成功的执行与后一个指令是否执行有关,那就得用到【&&】和【||】了。
2、&&、||
如果两个指令之间有相依性(所谓的相依性指的就是前一个指令执行的结果是否正确),那么我们就需要用到【&&】和【||】。
例子:
我不清楚/tmp/abc是否存在,可就是要建立/tmp/abc/hehe这个档案。
ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
上面这个例子总是会创建/tmp/abc/hehe档案的,不论/tmp/abc存不存在。
在一个例子:
用ls测试/tmp/hehe是否存在,如果存在现实“exist”,不存在显示“not exist”
ls /tmp/hehe && echo "exist" || echo "not exist"
指令是一个接着一个去执行的,因此如果真要使用判断,那么这个&&与||的顺序不能搞错,一般来说,假设判断式有三个,也就是:
cmd1 && cmd2 || cmd3
而且顺序通常不会变。
管线命令(pipe)
管线命令【|】可以处理经由前一个指令传来的正确信息,也就是stdout的信息。(去了解stdout)而对于stderr没有直接处理的能力。那么整体的管线命令可以使用下图表示:
在每个管线后面接的第一个数据必定是【指令】!!而且这个指令必须能接受standard input的数据才行,这样的指令才可以是【管线命令】。例如less、more、head、tail等都是可以接受standard input的管线命令。例如ls、cp、mv等就不是管线命令。
例子:
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ ls -al /etc/ | less
total 1264
drwxr-xr-x. 71 root root 4096 Mar 18 14:27 .
dr-xr-xr-x. 22 root root 4096 Mar 17 15:02 ..
-rw-r--r--. 1 root root 46 Feb 23 07:39 adjtime
-rw-r--r--. 1 root root 1512 Jan 12 2010 aliases
-rw-r--r-- 1 root root 12288 Feb 23 07:33 aliases.db
......省略
【撷取命令】 cut,grep
撷取命令就是将一段数据经过分析后,取出我们所想要的,或者经由分析关键词,取得我们所想要的那一行。不过,需要注意的是,撷取命令通常是针对【一行一行】来分析的,并不是整篇分析的。
1、cut
用法:
cut -d '分隔字符' -f fields <==用于有特定分隔字符
cut -c 字符区间
-d:后面接分隔字符。与-f一起用
-f:根据-d的分隔字符将一段讯息分割成为数段,用-f取出第几段的意思
-c:以字符(characters)的单位取出固定字符区间
范例1(将PATH变量取出,找出第三个路径):
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lovebell/bin
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ echo $PATH | cut -d ':' -f 3
/usr/bin
PATH以【:】作为分隔,因此会出现/usr/bin
如果要是列出第三个与第五个呢?
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ echo $PATH | cut -d ':' -f 3,5
/usr/bin:/usr/sbin
范例2(将export输出的信息,取得第十二个字符之后的所有字符串)
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ export
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTCONTROL="ignoredups"
...省略
<==每个数据都是排列整齐的输出,如果我们不想要【declare -x】时这么写即可:
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ export | cut -c 12-
CVS_RSH="ssh"
G_BROKEN_FILENAMES="1"
HISTCONTROL="ignoredups"
...省略
我们还可以指定某个范围的值,例如第12-20的字符,就是cut -c 12-20
cut主要的用途在于将【同一行里面的数据进行分解!】最常使用在分析一些数据或文字数据的时候!这是因为有时候我们会以某些字符当做分割的参数,然后来讲数据加以切割,以取得我们所需要的数据。
2、grep
刚刚的cut是将一行的讯息当中,取出某部门我们想要的,而grep则是分析一行讯息,若当中有我们所需要的信息,就将该行拿出来。
用法:
grep [-acinv] [--color=auto] 'str' filename
-a:将binary档案以text档案的方式搜寻数据
-c:计算找到'str'的次数
-i:忽略大小写
-n:输出行号
-v:反向选择,也就是显示出没有'str'内容的那一行
--color=auto:可以将找到的关键词部分加上颜色
范例1:(last可以输出登入者信息。【账号/终端机/来源/日期时间】)将出现root的行取出来
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ last | grep 'root'
root pts/1 192.168.95.246 Fri Mar 17 15:07 - 15:07 (00:00)
root pts/0 192.168.95.246 Fri Mar 17 15:03 - 15:07 (00:04)
范例2:在last的输出讯息中,只要有root就取出,并且仅取第一栏
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ last | grep 'root' | cut -d ' ' -f 1
root
root
范例4:取出/etc/man.config 内还有MANPATH的那几行
[lovebell@iZwz9gjh3pbz2k2hin7cg8Z ~]$ grep --color=auto 'MANPATH' /etc/man.config
加上--color=auto的选项,找到的关键字会用特殊颜色显示。
grep也可以配合正则表达式使用,能够处理的数据就更多了!