标准输入输出
Linux提供了3种I/O通道
标准输入设备(STDIN)- 默认为键盘
标准输出设备(STDOUT)- 默认为终端窗口
标准错误输出(STDERR)- 默认为终端窗口
 
输出重定向(Redirect Output)
>:重定向正确信息
>>:追加重定向
2>:重定向输出错误信息
如:
首先,切换至普通用户,然后执行find命令,看看会有哪些信息
SolidCaptureImage8531031
解释一下这条命令的作用,用find命令查找/etc目录下名称为passwd的文件,但是看到了很多“permission denied”,是由于普通用户无法查看/etc目录下的一些内容导致该命令返回了一些正确信息和一些错误信息,但是这种信息反馈不是很明了,比如我不想看到那些错误的信息,或者我只想看错误信息,该怎么办?这时就需要用输出重定向来帮忙
我们可以分别将正确信息和错误信息重定向至2个文件中,分别为find.ok和find.err,执行完后,可以看出,用“>”已经将正确信息提取出来并输出到file.ok文件中,而错误信息默认返回至终端屏幕,反之亦然,分别查看file.ok和file.err,可以看到,我们的要求已经达到,file.ok中只有2条正确信息,file.err中含有除了2条正确信息以外的错误内容
SolidCaptureImage12404000
还有一种需求,我想每次执行这条命令时不向屏幕返回结果,而把所有信息输出至文件file.all,这时就没法用“>”或“2>”了,因为他们会输出2种信息,这里我需要用到管道和另外一种输出符
管道Pipes:“|”
管道就像它的符号那样,简单说是连接2条命令的媒介,通常会把前一条命令的内容传送至后一条命令再做处理,但管道通常只会传送STDOUT,而不会传送STDERR,所以我们需要改变一下输出信息的性质,将错误的转化为一种让管道认为是正确的信息从而可以被传送,“2>&1”
SolidCaptureImage11809125
由于管道只做传送,不做输出,所以需要先将所有内容传送至cat程序,再由cat通过“>”重定向到file.all中
还可以用“&>”重定向所有输出
$ find /etc –name passwd &> file.all
将获得和管道一样的效果
另外再介绍几种管道的简单用法
想查看/etc/passwd中使用/bin/bash的用户信息
SolidCaptureImage12171328
将cat出的内容通过管道传送给grep程序,由grep过滤出含有/bin/bash的条目并显示出来
将多页信息传送给less进行分页查看可以使用:
ls –l /etc | less
 
输入重定向(Redirecting STDIN)
标准输入重定向使用“<”
可以将一些文件的内容作为输入重定向的数据来源传送给某些命令
将.bash_profile文件的内容输入至tr命令,由tr命令做大写字母转小写处理后显示出来
SolidCaptureImage13360640
实际上只是显示为小写,真正文件的内容并未改变,原来是大写的还是大写,原来是小写的也还是小写
多行输入重定向“<<word”
表示直到输入word这个关键字时结束输入
比如用user1给root发一封邮件,标题为hello
SolidCaptureImage14219625
多行输入,以END为结束字
 
for循环
用于脚本书写,基本结构为
  • for:声明变量
  • do:$..调用声明变量并做某件事情
  • done:结束
1、以user1身份写一个脚本for,分别向root和user2发送一封标题为test内容也为test的邮件
SolidCaptureImage14757578
2、另一种声明变量的写法,定义一段数值范围,写一个测试ip连通性的脚本,比如连续ping 192.168.0.11~15,将返回信息输出至iptest文件
for IP in $(seq num_1 num_n)
SolidCaptureImage15168828
3、还是以发邮件为例,这次将邮件内容写入一个文件mail中,由脚本变量引用该外部文件
SolidCaptureImage15753625