一、输入输出重定向
输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。在日常的学习和工作中,相较于输入重定向,我们使用输出重定向的频率更高,所以又将输出重定向分为了标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式。
[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
&
[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个环境变量
变量名称 |