Linux学习笔记RHEL 7(三)--管道符、重定向、环境变量、Vim编辑器与Shell命令脚本

本文详细介绍了Linux中的输入输出重定向,包括标准输出重定向和错误输出重定向,以及管道符的使用。通过实例展示了如何将命令的输出作为另一个命令的输入,提高效率。此外,文章还讲解了环境变量的作用和重要性,特别是PATH变量在查找命令路径中的角色。最后,讨论了Vim编辑器的三种模式和Shell脚本的编写,包括条件测试语句、循环结构和参数处理。
摘要由CSDN通过智能技术生成

一、输入输出重定向

输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向错误输出重定向两种不同的技术,以及清空写入追加写入两种模式。


[root@localhost ~]# ifconfig > text.txt
[root@localhost ~]# cat text.txt
eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.21.112  netmask 255.255.255.0  broadcast 192.168.21.255
        inet6 fe80::20c:29ff:feff:1e9d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ff:1e:9d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 384  bytes 25361 (24.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 245  bytes 24198 (23.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 245  bytes 24198 (23.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost ~]# 

如果报错的话,就要用报错信息输出:


那么我们怎么知道一个信息是正确还是错误那?可以进行如下操作:

[root@localhost ~]# ls ana.cfg &>test(该语句表示无论是正确还是错误的,都将她写入到文件中)
[root@localhost ~]# wc -l anaconda-ks.cfg (输出该文件的所有行)
47 anaconda-ks.cfg
[root@localhost ~]# wc -l < anaconda-ks.cfg 
47
[root@localhost ~]# 

二、管道命令符(shift+enter上面的键)

其执行格式为“命令A | 命令B”。管道命令符的作用也可以用一句话来概括“把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入”。

比如,在发送电子邮件时,默认采用交互式的方式来进行,我们完全可以利用一条结合了管道符的命令语句,把编辑好的内容与标题一起“打包”,最终用这一条命令实现邮件的发送。

[root@localhost ~]# echo "hahahaha" | mail -s "hohohoho" root
[root@localhost ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/mail/root": 1 message 1 new
>N  1 root                  Tue Mar 27 09:09  18/611   "hohohoho"
& ^CInterrupt
& 
三、 命令行的通配符
作为Linux运维人员,我们有时候也会遇到明明一个文件的名称就在嘴边但就是想不起来的情况。如果就记得一个文件的开头几个字母,想遍历查找出所有以这个关键词开头的文件,该怎么操作呢?又比如,假设想要批量查看所有硬盘文件的相关权限属性,一种方式是这样的:
[root@localhost ~]# ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 Mar 27  2018 /dev/sda
[root@localhost ~]# ls -l /dev/sda1
brw-rw----. 1 root disk 8, 1 Mar 27  2018 /dev/sda1
[root@localhost ~]# ls -l /dev/sda2
brw-rw----. 1 root disk 8, 2 Mar 27  2018 /dev/sda2
[root@localhost ~]# ls -l /dev/sda3
ls: cannot access /dev/sda3: No such file or directory
[root@localhost ~]# 

幸亏我的硬盘文件和分区只有3个,要是有几百个,估计需要花费一天的时间来忙这个事情了。由此可见,这种方式的效率确实很低。这些硬盘设备文件都是以sda开头并且存放到了/dev目录中,这样一来,即使我们不知道硬盘的分区编号和具体分区的个数,也可以使用通配符来搞定。星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符(字母或者是数字),中括号内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。

下面我们就来匹配所有在/dev目录中且以sda开头的文件:


由上图可以看出来?不能匹配空值;

[root@localhost ~]# ls -l /dev/sda[1,3,5,7,9]
brw-rw----. 1 root disk 8, 1 Mar 27  2018 /dev/sda1
[root@localhost ~]# ls -l /dev/sda{1,3,5,7,9}
ls: cannot access /dev/sda3: No such file or directory
ls: cannot access /dev/sda5: No such file or directory
ls: cannot access /dev/sda7: No such file or directory
ls: cannot access /dev/sda9: No such file or directory
brw-rw----. 1 root disk 8, 1 Mar 27  2018 /dev/sda1

{}会报错但是[]不会报错;

使用[0-9]来匹配0~9之间的单个数字:

[root@localhost ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 Mar 27  2018 /dev/sda1
brw-rw----. 1 root disk 8, 2 Mar 27  2018 /dev/sda2
四、 常用的转义字符

为了能够更好地理解用户的表达,Shell解释器还提供了特别丰富的转义字符来处理输入的特殊数据。

4个最常用的转义字符如下所示。

反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。

单引号(''):转义其中所有的变量为单纯的字符串。

双引号(""):保留其中的变量属性,不进行转义处理。

反引号(``):把其中的命令执行后返回结果。

echo就是用来提取出来$后面变量的值:
[root@localhost ~]# PRICE=5
[root@localhost ~]# echo $PRICE
5

然后使用echo命令来查看本机的Linux版本和内核信息:


下面的图可以看出,两个颜色的不同,说明命令已经经过别名文件处理了:


取消别名处理:



五、重要的环境变量

在Linux系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。

[root@localhost ~]# echo $PATH(变量必须大写)
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
[root@localhost ~]# echo $path

[root@localhost ~]# 

简单来说,命令在Linux中的执行分为4个步骤。

第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。

第2步Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用alias命令来创建一个属于自己的命令别名,格式为“alias 别名=命令”。若要取消一个命令别名,则是用unalias命令,格式为“unalias 别名”。我们之前在使用rm命令删除文件时,Linux系统都会要求我们再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令,接下来我们把它取消掉:

[root@linuxprobe ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
[root@linuxprobe ~]# rm anaconda-ks.cfg 
rm: remove regular file ‘anaconda-ks.cfg’? y
[root@linuxprobe~]# alias rm
alias rm='rm -i'
[root@linuxprobe ~]# unalias rm
[root@linuxprobe ~]# rm initial-setup-ks.cfg 
[root@linuxprobe ~]#

第3步Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令。

第4步系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。


例如,我们使用下述命令来查看HOME变量在不同用户身份下都有哪些值(su是用于切换用户身份的命令):

[root@linuxprobe ~]# echo $HOME
/root
[root@linuxprobe ~]# su - linuxprobe
Last login: Fri Feb 27 19:49:57 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ echo $HOME
/home/linuxprobe

Linux系统中最重要的10个环境变量

变量名称
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值