Shell基础— Bash的基本功能(二)

五、输入输出重定向

1、Bash的标准输入输出

我们前边一直在说,在Linux系统下,一切皆是文件。键盘和显示器都是文件,如下图:

从上图中可以看出,键盘的设备文件名为/dev/stdin,显示器标准正确输入的设备文件名为/dev/stdout,显示器标准错误输入的设备文件名为/dev/stderr
这些设备文件名非常不好记忆,shell允许我们用文件描述符来描述对应的设备,也就是用0、1、2,分别对应键盘、正确显示器,错误显示器。

2、输出重定向

什么叫输出重定向?
命令的输出,是输出给标准输出的,也就是输出到显示器上。而输出重定向就是命令的输出,不输出给标准输出,而是把输出的内容,输出到文件中。
(1)标准输出重定向

  • 命令 > 文件:以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中。
  • 命令 >> 文件:以追加的方式,把命令的正确输出,输出到指定的文件或设备当中。

练习,如下图:

只要该命令有结果,都能够输进行输出重定向。
(2)标准错误输出重定向
如果执行的命令出现报错,用上边的方式是不能够进行输出内容重定向的,错误信息会直接输出到标准错误输出,如下图:

  • 错误命令 2>文件:以覆盖的方式,把命令的错误输出,输出到指定的文件或设备当中。
  • 错误命令 2>>文件:以追加的方式,把命令的错误输出,输出到指定的文件或设备当中。

这个2是文件描述符,表示标准错误输出,看上表。
示例如下:

这里需要注意的是,上边的标准正确输出和标准错误输出的重定向有一些小问题,就是我要事先知道这条命令是否报错,才能选择是使用标准正确输出还是使用标准错误输出。这样十分不合理,我明知道命令会报错,那我直接写对不就完了。所以我们在工作中写脚本的时候,常用的输出重定向的方式是下面的方式。
(3)正确输出和错误输出同时保存

  • 命令 > 文件 2>&1:以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
  • 命令 >> 文件 2>&1:以追加的方式,把正确输出和错误输出都保存到同一个文件当中。(常用)

命令 >> 文件 2>&1的意思是,把命令的正确输出,输出到文件中,然后把命令的错误输出,输出到正确输出的文件中。

  • 命令 &>文件:以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。
  • 命令 &>>文件:以追加的方式,把正确输出和错误输出都保存到同一个文件当中。(常用)

  • 命令>>文件1 2>>文件2:把正确的输出追加到文件1中,把错误的输出追加到文件2中。(常用)

统一保存和分开保存看你习惯。
注意,在正确输出的时候>或者>>两边是可以有空格的,如果是错误输出的时候,2和>或者>>之间是不能有空格的。
如下图,提示语法错误。

3、输入重定向

输入重定向就是<。意思是命令的输入是由标准输入输入的,也就是由键盘输入的。输入重定向就是改变输入方向,不在由键盘作为输入,而拿文件作为命令的输入。输入重定向比较少见。
我们只在之前给源码包打补丁的patch命令,和rpm源码包文件提取中的cpio命令用到过。
<<号用的就更少了,基本没有实际的应用。

uio就相当于一个分界符,在两个uio中间的内容,输入给wc命令,进行统计。

六、多命令顺序执行

Linux系统支持多条命令顺序执行,就是我可以依次输入多条命令后,统一按enter键,顺序执行。

1、多命令执行符

在多个命令之间加即可多命令顺序执行。
命令格式:命令1 ; 命令2
说明:

  • 多个命令顺序执行,命令之间可以没有任何逻辑联系。

  • 不管前面的命令是否正确执行,后面的命令都会执行。

2、多命令执行符&&

&&又叫逻辑与执行符。
命令格式:命令1 && 命令2
说明:

  • 当命令1正确执行($?=0),则命令2才会执行。
  • 当命令1执行不正确($?≠0),则命令2不会执行。
  • 命令1和命令2之间可以没有任何逻辑联系。

练习1:命令1正确执行

练习2:命令1不正确执行

($?=0):这里先不说什么意思,后边预定义变量在讲。

3、多命令执行符||

||又叫逻辑或执行符。
命令格式:命令1 || 命令2
说明:

  • 当命令1执行不正确($?≠0),则命令2才会执行。
  • 当命令1正确执行($?=0),则命令2不会执行。
  • 命令1和命令2之间可以没有任何逻辑联系。

练习1:命令1正确执行

练习2:命令1不正确执行

4、&&||联合应用

&&||两个执行符可以联合应用,来判断命令是否正确执行。
执行语句:[root@localhost ~]# ls && echo yes || echo no
如果ls命令正确执行了,则echo yes命令就会执行,会输出一个yes。echo no命令判断前边echo yes命令执行了,则echo no命令则不会执行。
如果ls命令报错了,则echo yes命令就不会被执行,echo no命令需要判断前边的命令是否执行错误,因为echo yes命令没有执行,被跳过了,所以是判断ls命令是否报错,而ls命令报错了,则执行echo no命令,输出no。
换句话说,ls位置的命令,如果正确执行,则输出yes,如果错误执行,则输出no。
(所以需要注意的是,需要判断命令执行是否出错,而不是命令是否执行。不执行的命令就被挖掉,不予判断。)
练习:

问题:我能不能把上边命令中的&&||的位置互换?
答案是不能。
直接看例子,自己推导:

结论,这是一个固定格式。

七、管道符

我们之前已经有文章说过管道符了,
管道符—grep命令。
今天这里再简单总结一下用法。

1、行提取命令grep

grep命令的作用,是在指定的文件中,搜索符合条件的字符串。
命令格式:
[root@localhost ~ ] # grep [选项] ”搜索内容” 文件名
选项:

  • -A 数字:列出符合条件的行,并列出后续的n行。
  • -B 数字:列出符合条件的行,并列出前面的n行。
  • -c:统计找到的符合条件的字符串的次数。
  • -i:忽略大小写。
  • -n:输出行号。
  • -v:反向查找。
  • --color=auto:搜索出的关键字用颜色显示。

例子1:查找用户信息文件/etc/passwd中,有多少可以登录的用户。
[root@localhost ~ ] # grep "/bin/bash" /etc/passwd
例子2:查找用户信息文件/etc/passwd中,包含有“root"的行,并列出后续的3行。
[root@localhost ~ ] # grep -A 3 "root" /etc/passwd
例子3:查找用户信息文件/etc/passwd中,可以登录的用户,并显示行号。
[root@localhost ~ ] # grep -n "/bin/bash" /etc/passwd
例子4:查找用户信息文件/etc/passwd中,不含有“/bin/bash"的行,其实就是列出所有的伪用户。
[root@localhost ~ ] # grep -v "/bin/bash" /etc/passwd

2、find和grep的区别

find命令是在系统当中搜索符合条件的文件名,搜索时文件名是完全匹配。如果需要模糊查询,使用通配符进行匹配。

#建立文件abc
[root@localhost ~ ] # touch abc
#建立文件abcd
[root@localhost ~ ] # touch abcd
#查找abc文件
[root@localhost ~ ] # find . -name ”abc"
./abc

搜索文件名是abc的文件,只会找到abc文件,而不会找到文件abcd。虽然abed文件名中包含abc,但是find是完全匹配,只能和要搜索的数据完全一样,才能找到。
注意:find命令是可以通过-regex选项识别正则表达式规则的,也就是说find命令可以按照正则表达式规则匹配,而正则表达式是模糊匹配。但是对于初学者而言,find命令和grep命令本身就不好理解,所以我们这里只按照通配符规则来进行find查询。

grep命令是在文件当中搜索符合条件的字符串,如果需要模糊查询,使用正则表达式进行匹配,搜索时字符串是包含匹配。

#在test文件中写入abc数据
[root@localhost ~ ] # echo abc > test
#在test文件中再追加abcd数据
[root@localhost ~]#echo abcd >> test
#在test文件中查找abc字符串
[root@localhost ~]#grep”abc" test 
abc 
abcd

grep命令查找时,只要数据行中包含有abc,就会都列出,所以abc和abed都可以查询到。

3、管道符

管道符之前总结过,请看之前的文章
我们下面简单的做几个练习
练习1:
查询本地所有网络连接,提取包含ESTABLISHED(已建立连接)的行,就可以知道我们的服务器上有多少已经成功连接的网络连接。
[root@localhost ~ ] # netstat -an | grep "ESTABLISHED"
练习2:
如果想知道具体的网络连接数量,就可以再使用wc命令统计行数。
[root@localhost ~ ] # netstat -an | grep "ESTABLISHED" | wc -l

4、通配符

通配符是用来匹配文件名的,文件名在查询的时候是完全匹配的,必须一模一样才会查询出,否则就要加通配符,进行模糊查询。

练习:

#创建4个测试文件
[root@localhost tmp] # touch abc
[root@localhost tmp] # touch abcd
[root@localhost tmp] # touch 012
[root@localhost tmp] # touch 0abc

#“*”代表查找所有的文件
[root@localhost tmp] # ls *
012 0abc abc abcd

#“?"匹配任意一个字符,所以会匹配0abc
#但是不能匹配abc,因为“?”"不能匹配空
[root@localhost tmp] # ls ?abc
0abc

#匹配任何以数字开头的文件
[root@localhost tmp] # ls [0-9]*
012 0abc

#匹配不已数字开头的文件
[root@localhost tmp] # ls [^0-9]*
abc abed

最好我这里给你们分享一下我所积累和真理的文档和学习资料有需要是领取就可以了

1、学习思路和方法

这个大纲涵盖了目前市面上企业百分之99的技术,这个大纲很详细的写了你该学习什么内容,企业会用到什么内容。总共十个专题足够你学习

2、想学习却无从下手,该如何学习?

这里我准备了对应上面的每个知识点的学习资料、可以自学神器,已经项目练手。

3、软件测试/自动化测试【全家桶装】学习中的工具、安装包、插件....

4、有了安装包和学习资料,没有项目实战怎么办,我这里都已经准备好了往下看

5、如何领取这些配套资料和学习思路图,以及项目实战源码。

这些资料都已经让我准备在一个php网页里面了,可以在里面领取扫码或者进Q群交流都可以暗号和备注是111哦

最后送上一句话:

世界的模样取决于你凝视它的目光,自己的价值取决于你的追求和心态,一切美好的愿望,不在等待中拥有,而是在奋斗中争取。

如果我的博客对你有帮助、如果你喜欢我的文章内容,请 “点赞” “评论” “收藏” 一键三连哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值