shell: Shell(二):变量、数据重定向和管道
在上一篇博客 Shell(一):功能、配置和插件中,介绍了为什么要使用shell,shell有哪些功能,如何使用 oh my zsh来提高效率等,本篇重点介绍,shell中的 变量的如何设置和读取数据,读取之后如何使用变量?每个程序一般都有输入和输出,让我们看看 数据重定向如何处理输入和输出的?还有,Unix/Linux系统提供丰富的工具,我们如何将这些工具通过 管道来组合成更加强大的宏工具呢?下面,由我来逐一详细介绍变量、数据重定向和管道。
变量
变量的作用
变量与其他程序设计语言一样,都是 存储数据,然后被程序引用。相比于不使用变量,而是直接使用数据,存在两个问题:
- 当数据改变时,直接使用数据的时候却不能灵活地根据数据改变而随着改变,而使用变量却不同,它能够做到这点。
- 当数据发生变化时,如果想保证数据 一致性,必须查找所有引用该数据的所有地方,然后将它修改,当下一次再需要修改时,也是像这种情况一样,是多么繁琐的事,而变量却不用,只需要修改变量值即可。
因此,变量具有 可变性和 易于修改的两个特点。
变量的分类
在shell中,大概分为两种变量: 环境变量和 局部变量,主要区别在于它们的使用范围不同,环境变量可以在父进程与子进程之间共享,而自定义变量只在本进程使用。举一个简单的例子来说明:

no share variable.png
我首先设置一个shell变量

share variable.png
但使用
查看环境变量
如果想查看 系统中以及 自定义有哪些环境变量,可以使用
而
变量有哪些操作
显示
如果你想显示某个变量的值,例如
echo $PATH

echo command.png
注意上面一条命令,需要在变量名前加上一个符号
设置
如果你想设置某个变量的值,只需在变量名和变量值之间用符号
由上面的输入命令
-
在命名变量名时,变量名称只能是英文字母和数字,而且首字母不能是数字。下面演示一个错误的例子:
wrong variable name.png
-
等号
= 两边不能有 空格 -
如果变量值有空格,可用双引号
” >” 或单引号‘ ‘ 来包围变量值,但两者是有区别:双引号
” >” 内的一些特殊字符,可以保持原有的特性,例如:double quotation marks.png
而单引号
‘ ‘ 内的一些特殊字符,仅为一般字符,即纯文本,例如:single quotation marks.png
-
如果想显示一些特殊字符($、空格、!等),在字符前面加上用转义字符
-
有些时候,变量的值可能 来源于一些命令,这时你可以使用反单引号
` 命令` 或$(命令) ,例如:使用反单引号
` 命令` 的方式get information from comand 1.png
使用
$(命令) 的方式get information from comand 2.png
-
如果变量想 增加变量的值,可以使用
$variable 累加 -
如果变量需要在其他子进程使用,用
export 关键字来设置变量为环境变量export VARIABLE -
系统环境变量一般都是 字母全部大写,例如:
PATH,
HOME ,SHELL 等 -
如果想取消设置变量的值,使用
unset variable 命令。注意,变量之前是没有符号$
环境配置文件
之前那些设置的环境变量,一旦退出系统后,就 不能再次使用,如果想再次使用,必须重新再设置才行。如果想就算退出系统,也能重新使用自定义的环境变量,那怎么办呢?
不用怕,系统提供一些环境配置文件:
但在

source command.png
数据重定向
含义
当输入命令行时,一般都有输入参数(standard input),而命令行处理完之后,一般都有输出结果,结果有可能成功(standard output),也有可能失败(standard error),而这些结果一般都会输出到屏幕上,如果你想控制结果输出到文件或以文件作为输入的话,你需要了解数据重定向的分类和符号操作。
分类
数据重定向主要分为三类:
-
stdin ,表示标准输入,代码为0,使用< 或<< 操作符
符号< 表示以文件内容作为输入
符号<< 表示输入时的结束符号 -
stdout ,表示标准输出,代码为1,使用> 或>> 操作符
符号> 表示以 覆盖的方式将 正确的数据输出到指定文件中
符号>> 表示以 追加的方式将 正确的数据输出到指定文件中 -
stderr ,表示标准错误输出,代码为2,使用2> 或2>> 操作符
符号2> 表示以 覆盖的方式将 错误的数据输出到指定文件中
符号2>> 表示以 追加的方式将 错误的数据输出到指定文件中
使用
stdout
当你输入
而符号
当你再次输入命令

stdin demo 1.png
而你这次使用符号
stderr
这次我输入命令

stderr demo 1.png
如果你想追加错误信息,可以使用

stderr demo 2.png
stdout & stderr
-
将stdout和stderr分离:
> 和2> 符号输入
ls README.md test ,在屏幕显示既有正确信息,也有错误信息,如果想将正确信息和错误信息分离到不同文件,你可以同时使用> 和2> 符号seperate stdout & stderr.png
-
将stdout和stderr合并:
&> 符号如果你想将正确信息和错误信息 合并,且输出到同一个文件,可以使用
&> 符号combine stdout & stderr.png
stdin
一般输入一些简单的数据的方式都是通过 键盘,但是如果要输入大量的数据,最好还是通过 文件的方式。举一个简单例子:
首先输入

stdin demo 1.png
但如果有大量数据从一个文件导入到
还一个符号

stdin demo 3.png
管道
在Unix设计哲学中,有一个重要设计原则-- KISS(Keep it Simple, Stupid),大概意思就是 只关注如何做好一件事,并把它做到极致。每个程序都有各自的功能,那么有没有一样东西将不同功能的程序互相连通,自由组合成更为强大的宏工具呢?此时, 管道出现了,它能够让程序实现了 高内聚,低耦合。

How Pipe works.png
如果我想查看文件是否存在某个关键字,此时我可以使用管道

命令
-
cat README.md 查看文件内容 - 然后将
cat README.md 输出的内容作为grep 'pod' 命令的输入,再进行处理。
上面一个很关键的符号