第七单元 :标准的输出管道命令及for...do...done语句
1.输出和输出重定向:
A.在I/O输出分为正确的输出和错误的输出,例如:
正确的输出:【root@nana-pc mnt】# ls
file1 file2 file3 file4 file5
错误的输出:【root@nana-pc mnt】# sadfsadf
bash:sadfsadf: command not found
(问题1:因为ls命令是本身就知道的正确的输出命令,而sadfsadf命令是随机乱编的一个系统不存在的命令,所以通过它们对比来显示正确的输出和错误的输出。这样的理解是正确的吗?)
B.重定向输出:(注意学习这块内容做实验时要用一个普通用户)
a.重定向正确的输出: > ,例如:
【xiyou@nana-pc ~】$ find /etc/ -name passwd >file
find:/etc/ipsec.d/private:权限不够
find:/etc/cups/ssl:权限不够
find:/etc/chatscripts:权限不够
find:/etc/vpnc:权限不够
find:/etc/polkit-1/localauthority:权限不够
find:etc/ppp/peers:权限不够
find:etc/ssl:权限不够
【xiyou@nana-pc ~】$ cat file
/etc/passwd
/etc/pam.d/passwd
/etc/cron.daily/passwd
【上例说明,在执行这个命令的时候,find命令的正确输出没有显示出来,而是被重定向到file这个文件中】
b.重定向错误的输出:2> ,例如:
【xiyou@nana-pc ~】$ find /etc/ -name passwd 2>file.er
/etc/passwd
/etc/pam.d/passwd
/etc/cron.daily/passwd
【xiyou@nana-pc ~】$ cat file.er
find:/etc/ipsec.d/private:权限不够
find:/etc/cups/ssl:权限不够
find:/etc/chatscripts:权限不够
find:/etc/vpnc:权限不够
find:/etc/polkit-1/localauthority:权限不够
find:etc/ppp/peers:权限不够
find:etc/ssl:权限不够
【上例说明,find命令的错误输出被重定向到了file.er这个文件中】
c.重定向所有的输出:&> ,find命令在执行的时候没有输出,所有的输出都被定向到另一个文件中;
(问题2:重定向正确的输出、错误的输出和所有的输出基本了解,find命令执行之后的命令何来对错而言?应该就是我不知道find命令的作用吧,我好像看后面某章讲到了这个命令)
d.追加正确的输入:>>
(问题3:这一块例子的操作都有问题,连正确的追加都实现不了,下面附上一张错误的截图。此外,怎么理解“用>重定向的时候会覆盖文件原有内容而用>>不会”这句话?希望举例子讲解一下)
2.管道命令:
A.管道的意义在于用多条命令组合操作达到一个比较复杂的目的。例如,想查看/etc这个目录中有多少个次级文件,用ls只能显示这个目录里面的内容,达不到所要的效 果,而wc -l 命令用于统计所输出内容的结果,故可以用管道命令将两者结合起来实现最终的结果,命令书写如下:ls /etc |wc -l
B.在标准输出中只有正确的内容可以通过管道,例如:
【xiyou@nana-pc ~】$ find /etc/ -name passwd |wc -l
find:/etc/ipsec.d/private:权限不够
find:/etc/cups/ssl:权限不够
find:/etc/chatscripts:权限不够
find:/etc/vpnc:权限不够
find:/etc/polkit-1/localauthority:权限不够
find:etc/ppp/peers:权限不够
find:etc/ssl:权限不够
3
【通过这条命令可以看到用wc命令来统计find命令输出的行数,结果是3。上例中输出的是find命令的错误内容,3显然是将正确内容通过了管道】
C.让错误的输出也可以通过管道,要在管道符前加2>&1来实现,例如:
【xiyou@nana-pc ~】$ find /etc/ -name passwd >file
10
【find命令的正确输出3行,错误输出7行】
D.让一组命令通过管道:当让一组命令的输出全部通过管道,要把这个命令组用()括起来;(问题4:将册子上的例子操作了一遍,可是我不理解它怎么实现了让一组命令通过管道)
3.导入符号<及多行录入<<(问题5:这一块看不懂看不懂就是看不懂)
4.for…do…done语句:for指定变量值,do做什么事情,done完成
A.可以写在命令行中执行,例如:
【xiyou@nana-pc mnt】# for ip in $(seq 1 3);do ping -cl -wl 192.168.0.$ip;done
……
……
【for定义变量,do使用变量,done完成,$(seq 1 3)的意义在于赋予ip这个变量1到3这个值】
B.在脚本中,例如:(for…do…done语句在脚本中应用地很广泛)
【xiyou@nana-pc mnt】# vim test
【xiyou@nana-pc mnt】# cat test
#!/bin/bash
for ip in $(seq 1 3)
do
ping -cl -wl 192.168.0.$ip
done
再用sh test执行这个脚本就可以了,效果和上面是一样的;