[toc]

4-管道符、重定向与环境变量

一、输入输出重定向

1、输入重定向

输入重定向:是指把文件导入到命令中

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。

输入重定向中的符号及作用:

  • 命令 < 文件:将文件作为命令的标准输入
  • 命令 << 分界符:从标准输入中读入,直到遇见分界符才停止
  • 命令 < 文件1 > 文件2:将文件1作为命令的标准输入并将标准输出到文件2
示例1:输入重定向把/etc/passwd文件导入给wc -l命令,统计一下文件中的内容行数。
[root@localhost ~]# wc -l < /etc/passwd
44

image

示例2:使用cat从标准输入中读取,遇到/结束
[root@localhost ~]# cat << /
> hello
> /
hello

image

示例3::使用cat从标准输入中读取,遇到/结束,并输出到new.txt文件。
[root@localhost ~]# cat << / > new.txt
> hello
> /
[root@localhost ~]# cat new.txt 
hello

image

标准输入在工作中很少使用,了解即可

2、输出重定向

输出重定向:是指把原本要输出到屏幕的数据信息写入到指定文件中

输出重定向分为:

  • 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
  • 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。

输入重定向中的符号及作用:

  • 命令 > 文件:将标准输出重定向到一个文件中(清空原有文件的数据)
  • 命令 2> 文件:将错误输出重定向到一个文件中(清空原有文件的数据)
  • 命令 >> 文件:将标准输出重定向到一个文件中(追加到原有内容的后面)
  • 命令 2>> 文件:将错误输出重定向到一个文件中(追加到原有内容的后面)
  • 命令 >> 文件 2>&1命令 &>> 文件:将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)
示例1:通过标准输出重定向将echo命令原本要输出到屏幕的信息写入到文件read.txt
[root@localhost ~]# echo 'hello linux' > read.txt
[root@localhost ~]# cat read.txt
hello linux
示例2:通过标准输出重定向将echo命令原本要输出到屏幕的信息追加到文件read.txt
[root@localhost ~]# echo 'hello world' >> read.txt
[root@localhost ~]# cat read.txt
hello linux
hello world
示例3:使用ls命令查看文件,将错误信息写入read.txt
[root@localhost ~]# ls ab.txt 2> read.txt
[root@localhost ~]# cat read.txt 
ls: 无法访问ab.txt: 没有那个文件或目录

注意:对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的

使用错误输出重定向时,正确的信息不会写入到文件,如果想要把正确与错误信息都写到文件中,怎么做?

示例4:创建脚本文件,执行脚本,将正确信息与错误信息都重定向到read.txt文件

① 创建脚本test.sh

ls -l a.txt # 存在的文件能够标准输出
wc -l ab.txt # 不存在的文件,错误输出

② 使用bash执行脚本,并将正确与错误信息写入文件

[root@localhost ~]# bash ./test.sh >> read.txt 2>&1 
[root@localhost ~]# cat read.txt 
-rw-r--r--. 1 root root 0 2月  19 14:07 a.txt
wc: ab.txt: 没有那个文件或目录

注意:执行一个自动化的Shell脚本时,这个操作会特别有用

二、管道命令符

如果需要多个命令一起配合执行,则就要用到管道命令符。

管道命令符:把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入。

格式:命令A|命令B

示例1:通过匹配关键词/sbin/nologin找出了所有被限制登录系统的用户。

找出被限制登录用户命令

[root@localhost ~]# grep "/sbin/nologin" /etc/passwd

统计文本行数的的命令

[root@localhost ~]# wc -l

使用管道命令符将两个命令结合起来

[root@localhost ~]# grep "/sbin/nologin" /etc/passwd | wc -l
39

示例2:通过把管道符和passwd命令的--stdin参数相结合完成密码重置操作

[root@localhost ~]# echo 'tiger' | passwd --stdin tiger
更改用户 tiger 的密码 。
passwd:所有的身份验证令牌已经成功更新。

三、命令行通配符

1、为什么使用命令行通配符

问题:假设想要批量查看所有硬盘文件的相关权限属性要怎么做?

#ls -l /dev/sda
#ls -l /dev/sda1
....

可使用命令行通配符简化这种操作。

2、命令行通配符

命令行通配符就是通用的匹配信息的符号。

  • *:代表匹配零个或多个字符
  • ?:代表匹配单个字符
  • [0-9]:代表匹配0~9之间的单个数字的字符
  • [abc]:则是代表匹配a、b、c三个字符中的任意一个字符

3、使用通配符

示例1:匹配所有在/dev目录中且以sda开头的文件
[root@localhost ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 2月  19 13:53 /dev/sda
brw-rw----. 1 root disk 8, 1 2月  19 13:53 /dev/sda1
brw-rw----. 1 root disk 8, 2 2月  19 13:53 /dev/sda2
示例2:匹配所有在/dev目录中且以sda开头,紧跟其他某一个字符的文件
[root@localhost ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 2月  19 13:53 /dev/sda1
brw-rw----. 1 root disk 8, 2 2月  19 13:53 /dev/sda2
示例3:匹配所有在/dev目录中且以sda开头,紧跟某个范围数字的文件
 ls -l /dev/sda[1-9] 
 ls -l /dev/sda[135] 
[root@localhost ~]# ls -l /dev/sda[1-9] # 代表1到9范围
brw-rw----. 1 root disk 8, 1 2月  19 13:53 /dev/sda1
brw-rw----. 1 root disk 8, 2 2月  19 13:53 /dev/sda2
[root@localhost ~]# ls -l /dev/sda[135] # 代表1,3,5任意符合的
brw-rw----. 1 root disk 8, 1 2月  19 13:53 /dev/sda1

四、常用的转义字符

作用:处理输入的特殊字符,比如要在命令行输出特殊字符$符号,就需要进行转义再能正常输出。

常用的转义字符:

  • 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
  • 单引号(''):转义其中所有的变量为单纯的字符串。
  • 双引号(““):保留其中的变量属性,不进行转义处理。
  • 反引号(``):把其中的命令执行后返回结果。

示例1:要在输入的价格前面加上一个$符号

① 先定义一个PRICE的变量并赋值,然后输出信息

[root@localhost ~]# PRICE=5
[root@localhost ~]# echo "价格为$PRICE"
价格为5

② 然后在价格前面加上一个$符号

因为$符号是特殊字符,代表一个变量,所以需要使用`\进行转义

[root@localhost ~]# echo "价格为\$$PRICE"
价格为$5

示例2:在输出信息中,执行命令将结果输出到命令行或文件

① 获取当前用户的名称

[root@localhost ~]# whoami
root

② 使用echo输入你好,我是***,用户名通过命令获取

[root@localhost ~]# echo "你好,我是`whoami`"
你好,我是root

五、环境变量

1、问题

在用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?

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

  • 第2步:Linux系统检查用户输入的命令是否为“别名命令”。

    • 创建命令别名:alias 别名=命令
    • 取消命令别名:unalias 别名
  • 第3步:Bash解释器判断用户输入的是内部命令还是外部命令。

    • 内部命令:是解释器内部的指令,会被直接执行;
    • 外部命令:用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。

    注: type 命令名称 (判断 内部命令|外部命令)

  • 第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置。

    PATH:是由多个路径值组成的变量,每个路径值之间用冒号间隔

2、变量

变量:是计算机系统用于保存可变值的数据类型。

在Linux系统中,变量名称一般都是大写的。

变量分为:

  • 一般变量:当前用户定义的变量,自行使用

  • 全局变量:其它用户也能使用的变量

    一般变量转为全局变量:export 变量

示例:定义变量msg 分别使用不同用户查看,然后将变量转为全局变量,再次查看

① 定义变量

[root@localhost ~]# MSG=你好,linux

② 分别使用不同用户查看

[root@localhost ~]# MSG=你好,linux
[root@localhost ~]# echo $MSG
你好,linux
[root@localhost ~]# su tiger
[tiger@localhost root]$ echo $MSG

[tiger@localhost root]$ 

结果为其它用户无法读取到root用户创建的变量。

③ 将一般变量转为全局变量

[root@localhost ~]# export MSG
[root@localhost ~]# su tiger
[tiger@localhost root]$ echo $MSG
你好,linux

此时变量转为全局变量,所有用户都能够使用。

3、环境变量

Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。

可使用env命令查看linux中所有的环境变量

linux中环境变量很多,不需要一一记忆,只需记住几个重要的变量。

重要的10个环境变量:

  • HOME:用户的主目录(即家目录)
  • SHELL:用户在使用的Shell解释器名称
  • HISTSIZE:输出的历史命令记录条数
  • HISTFILESIZE:保存的历史命令记录条数
  • MAIL:邮件保存路径
  • LANG:系统语言、语系名称
  • RANDOM:生成一个随机数字
  • PS1:Bash解释器的提示符
  • PATH:定义解释器搜索用户执行命令的路径
  • EDITOR:用户默认的文本编辑器
示例1:查看环境变量

查看HOME变量

[root@localhost ~]# echo $HOME
/root
示例2:设置一个名称为WORKDIR的环境变量,方便用户更轻松地进入一个层次较深的目录

① 创建一个深层目录

[root@localhost ~]# mkdir /home/workdir

② 创建变量WORKDIR

[root@localhost ~]# WORKDIR=/home/workdir

③ 使用变量

[root@localhost ~]# cd $WORKDIR
[root@localhost workdir]# 

④ 将变量转为全局使用的环境变量

[root@localhost workdir]# export WORKDIR
[root@localhost ~]# su tiger
[tiger@localhost root]$ cd $WORKDIR
[tiger@localhost workdir]$ 

作业

1、把ls命令的正常输出信息追加写入到error.txt文件中的命令是什么?

答:ls » error.txt

2、请简单概述管道符的作用。

答:把左面(前面)命令的输出值作为右面(后面)命令的输入值以便进一步处理信息。

3、Bash解释器的通配符中,星号(*)代表几个字符?

答:零个或多个。

4、PATH变量的作用是什么?

答:设定解释器搜索所执行的命令的路径。

5、使用什么命令可以把名为LINUX的一般变量转换成全局变量?

答:export LINUX。

刚学java菜鸡,永劫无间蚀月,王者荣耀王者,金铲铲小铂金,第五人格菜鸡,原神开服玩家,星穹铁道菜鸡,崩坏的菜鸡,闪耀暖暖,和平精英,LOL,CSGO,以及三A大作收集者等等。。。