管道符、重定向和环境变量
一、输入重定向和输出重定向
输入重定向就是把文件作为命令的参数,输出重定向就是把原本要输出到屏幕上的内容写到文件里面。
(1)输入重定向:
(2)输出重定向;
对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的。
示例:
重定向中的覆盖写入和追加写入的不同:
覆盖写入就是清除原有数据,只保留最后一次的输入;追加写入就是保留原来的数据在后面添加后来的数据
虽然都是输出重定向,但是标准输出和错误输出还是有区别的。如果文件存在则输出文件内容,如果不存在则错误消息会输出到屏幕,
如何把创建文件时的错误消息也写入呢?示例如下
还有一种常见情况,就是我们想不区分标准输出和错误输出,只要命令有输出信息则全部追加写入到文件中。这就要用到&>>操作符了:
二、管道符命令
其执行格式为“命令A | 命令B”。管道命令符的作用也可以用一句话概括为“把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入”
在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过把管道符和passwd命令的--stdin
参数相结合,可以用一条命令来完成密码重置操作:
如果需要将管道符处理后的结果既输出到屏幕,又同时写入到文件中,则可以与tee命令结合使用。
命令通配符
顾名思义,通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配
0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。
示例:
匹配所有在/dev目录中且以loop开头的文件:
如果只想查看文件名以ram开头,但是后面还紧跟其他某一个字符的文件的相关信息,这时就需要用到问号来进行通配了
通配符不仅可用于搜索文件或代替被通配的字符,还可以与创建文件的命令相结合,一口气创建出好多个文件。不过在创建多个文件时,需要使用大括号,
并且字段之间用逗号间隔:
转义字符
四个常见的转义字符:
我们先定义一个名为number的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息:
而如果只需要某个命令的输出值,可以像命令
这样,将命令用反引号括起来,达到预期的效果。例如,将反引号与uname -a命令结合,然后使用echo命令
来查看本机的Linux版本和内核信息:
三、环境变量
在Linux系统中,变量名称一般都是大写的,命令则都是小写的,这是一种约定俗成的规范。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。可以直接通过变量名称来提取到对应的变量值。
为了更好地帮助大家理解变量的作用,给大家举个例子。前文中曾经讲到,在Linux系统中一切都是文件,Linux命令也不例外。那么,在用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?简单来说,命令在Linux中的执行分为4个步骤。
第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是绝对路径则直接执行,否则进入第2步继续判断。
第2步:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。
使用rm命令删除文件时,Linux系统都会要求用户确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令—“rm -i”。
可以用alias命令来创建一个属于自己的命令别名,语法格式为“alias别名=命令”。若要取消一个命令别名,则是用unalias命令,语法格式为“unalias别名”。
第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令:
第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
常见环境变量:
Linux作为一个多用户、多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境。因此,一个相同的变量会因为用户身份的不同而具有不同的值。
其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建变量来满足工作需求。例如,设置一个名称为WORKDIR的变量,方便用户更轻松地进入一个层次较深的目录:
但是这样的变量不具有全局性,如果工作需要,可以使用export命令将其提升为全局变量,这样其他用户也就可以使用它了:
后续要是不使用这个变量了,则可执行unset命令把它取消掉: