目录 什么是 SHELL
SHELL 中的变量
普通变量
环境变量
环境变量实操
什么是 SHELL
概念解析 :
SHELL : 壳, 命令解释器 ,负责解析用户输入的命令。
它是系统的用户界面, 提供了用户与内核进行交互操作的一种接口。
图示:
注 : 结合上图所示就可以看到,无论是 用户 还是 应用程序 将指令传递过来
都是要经过 SHELL 的才能 传到内核中去,传到 SHELL 后,SHELL 进
行解析,解析成内核可执行的指令后再传给内核,内核再执行,内核执
行无非就是操作硬件,内核执行完后将结果便再回传给 SHELL 。
SHEL 再将 结果反馈给 用户或者 应用程序。
注 : 内置命令 与 外置命令
如何辨别 一个命令 是 内置命令 还是 外置命令 ?
我们通过 使用 命令 type 来辨别 内置还是外置 !!
内置命令 : type 会 显示 builtin 意思该命令为 内置命令
示例 :
[root@localhost ~]# type pwd
pwd is a shell builtin
上示就表示 pwd 为 内置命令
外置命令 : type 会显示 该命令所属的二进制文件的路径。
示例 :
[root@localhost ~]# type man
man is /usr/bin/man
上示就表示的是 man 命令是一个外置命令,因为给出了
man 所属二进制文件的路径 。
注 : SHELL 如何知道命令的可执行文件在哪个路径下呢 ??
例如 : SHELL 如何知道 cat 这个命令是在哪个路径下呢 ?
逻辑如下 : 当我们执行 cat 命令的时候, SHELL 是会先在环
境变量的路径下去搜索,搜索什么呢 ? 搜索 看看
有没有 cat 命令的二进制文件,如果有的话则直接
执行命令,如果没有,则会显示 command not found
所以,根据上示逻辑提到的 环境变量 , 将是上述问题的答案
系统为了让用户在命令行快速方便的执行命令,将可执行文件的路径存储在
环境变量 PATH 中。( 系统指定在了一个 特殊的环境变量 叫做 PATH )
演示 : 我们仍以 cat 命令示意 :
# : 我们之前学过搜索命令的命令—— whereis
我们用 whereis 搜索 cat 显示出 cat 命令在 /usr/bin/cat 这个路径下
然后我们用 echo $ 去访问 环境变量 PATH :
根据显示 SHELL 会先去 /usr/local/sbin 搜索,结果没有, 再去
/usr/local/bin 搜索,结果也没有,再去 /usr/sbin 搜索,结果还是没
有,接着再去 /usr/bin 搜索,结果有了 ,因为我们先用 whereis 搜
索 cat 命令 显示 cat 命令就在 /use/bin 这个路径下!!
因此,综上, SHELL 如何知道命令的可执行文件的过程就是上示演
示的全过程!!!
SHELL 中的变量
概念导入 :
# 提起 “ 变量 ” 这个名词,我们在什么知识都没有学习的情况下,最先想
到的肯定就是 “ 什么叫变量 ?? ”
我们最简单的理解 : 变量 —— 变化的量
随着知识的不断学习,当我们提起变量,自然也就会想到 一个可以指代
变量的名词 —— “ 变量名 ”
# 变量名 与 变量 的关系 :
当我们定义了变量后,我们想要访问变量的时候,通过什么访
问? —— 自然是通过变量名去访问变量的。
# 接下来在看 我们官方对 变量 的定义 :
官方 :
变量 : 简单说就是让某一个特定字符串代表不固定的内容。
看到上示的定义解析一下 :
特定字符串 : 就是 变量名
不固定的内容: 就是这个变量实际指的内容它是不固
定的,是可变的,这也就响应了我们最
初理解变量的内容,变量——变化的量
SHELL 中的变量 :
# 在 SHELL 中 变量分为两大类 “ 环境变量 ” 和 “ 普通变量 ”
环境变量 也叫 全局变量 ; 普通变量 也叫 局部变量
普通变量
普通变量 :
简单 : 就是只在 局部才能使用 的变量 。
官方 : 只能在创建它们的 SHELL 函数 或 SHELL 脚本中使用,普通变
量一般由开发者在开发脚本程序时创建。
示例 :
上示代码表示的含义是 :
定义了一个 名叫 data 的变量,给其赋的值为 1 。先不管如何定
义变量,这个我们后期会讲解到;
定义data变量后,我们访问 data 变量,显示其值为 1。
(前面我们学习了 访问变量是用 echo $ + 变量名来访问的 )
我们得到了 变量 Data 的值,说明我们访问成功了;大家可以看
到在上示图中我用两个黄色线条画了两个圈,其中最上面的那个
小圈,圈的是什么意思呢? —— 它的含义是 当前的会话窗。
为了更好的理解 普通变量(全局变量)我们再创建一个新的 会
话窗口,再次访问 Data 变量,来看看还是否能够访问?
结合上图所示 :
我们只是复制了会话,然后,想要 再次访问 Data 变量
就会发现 并没有显示 Data 变量的值 。
这说明什么??
说明在新复制的会话里面,没有访问到 Data 变量。
结合对比提出几个问题 :
当第一次我们定义了 Data 变量,并且能够成功访问这个
变量(显示它的值!) 。
# 那么这个变量是在哪里定义的 ? ? ?
是 root 用户当前登录到SHELL环境里定义的!!
# 那么为什么第二次复制了会话后,就不能访问Data变
量了(没有显示Data变量的值)???
因为重新复制会话或者重新建立连接,意味着改变了
SHELL 环境。
设置变量(规则) :
# 只能使用数字、字母下划线、且不能用数字开头
# 变量名和变量值用 “ = ” 连接
# 等号两边不能有 空格符
变量赋值的五种写法 :
# Bliang=value
上示 就是最最基本的 变量的表示 ,含义就是 现在
给 一个叫做 Bliang 的变量名 赋值为 value
# Bliang_1=' value '
同理 : 变量名为 Bliang_1 赋的值为 value
区别 : 在于 值 value 加了一对 单引号 'value'
那么 ' ' 的意义是什么呢 ??
就是 : 引号里面是啥 就原封不动的 显示啥
还有一层含义在 下面的 注 里解释。
# Bliang_2="value"
同理 : 变量名为 : Bliang_2 赋的值为双引号 " "
里面的东西(但又不纯粹是原封不动)
详解 看下面的 注 里解释
# Bliang_3=`pwd`
这个又与上示三个有着 不同,它给值加的是 反引号
` ` 显然 反引号里面 的内容不同于 前面几个,是
pwd 是 命令 !!!
是的 反引号 ` ` 里面只能是命令,不能是字符串!
# Bliang_4=$(pwd)
这种形式和 上面反引号的含义是一模一样的,完全
相同。 括号里面只能放命令,是把命令执行成功后
的内容赋给变量!!!!
注 注 注 注 :
# 上示 五种 都是变量的表示方法
# 本条 先来解释下 表示的前三个 :
Bliang=value Bliang_1=' value ' Bliang_2="value"
我们明显可以看到 上示三种表示 最大的区别在于
第一和 第二 三 的 带不带引号
第二和 第三 的 单引号 还是 双引号
带不带引号 :
首先 单单仅就 当赋的值 为 value 来说 : 三种方式的赋值
当访问变量时,显示的结果是完全一样的,都是显示值。
那么,如此看来 似乎没有区别,带不带引号结果都一样,
答案是否定的,请再看接下来的示例 :
上示就表示了 带与不带 引号(无论是单引号,还是双引
号)的区别 :
不带引号的时候,变量赋值 如果 赋的值 比较多,并且
中间用了空格分开来,那么,赋值则是失败的,因为这
一长串会自动被系统当做了命令来处理,可以看上示第
一行代码失败后给出的解释 : command not found... ;
我们明明是做的 变量的赋值,解释却是 没有找到命令,
这就说明 系统把你要赋的一长串的值当做了命令来处
理。
而当给同样长的 值 加上 引号,无论是 单引号,还是双
引号,当进行访问变量的时候 都是有效的!!!!
结 : 带不带引号 :
带 :赋的值可以为 很长的字符串
不带 :赋的值只能 为单个字符串,不能有空格。
单引号与双引号 :
先对上示各行命令做以解释:
我们对三个变量分别进行赋值 可以看到的是 给
单引号 和 双引号 里放的内容是一样的 都是
$Bliang1 ; ( $Bliang1 的意思是提取 变量 Bliang1
的值 ) 但是可以看到的是 当对同一个值 分别加
上不同的引号,则访问变量时 显示出的结果是不
一样的。
结 :
单引号 : 引号里面的内容是什么,访问变量时就
显示什么,原封不动!!!!
双引号 : 它是先对引号里面的内容运行了一
下,将运行后的结果作为 值 赋给变量
而后,等访问变量的时候 访问的值就
是刚才 引号里面先运行后的值!!!
但是,当双引号里面的值 不是特殊的
内容的时候(就像上面 $Bliang1,代表
提取内容的时候),那它就和 单引号
没啥区别。
# 反引号举例 :
当给 变量名为 data 赋值为 ` 3 ` 则报错 原因是 反引号下的内
容 3 压根就不是命令。
当给 变量名为 Bliang 赋值为 ` pwd ` 没有报错,反而能够访
问变量成功显示的值为 /root ,这是因为 反引号下的 pwd 就是
命令,/root 就是 由 pwd 命令执行成功的内容!!
结 :
也就是说 `` 的作用就是 里面只能放 命令,是把 命令执
行成功后的值赋给变量。
环境变量
官方定义 : 环境变量 也可以称为 全局变量,可以在创建它们的 Shell 及其派生出来的任
意子进程 SHELL 中 使用。
# 环境变量 也叫 全局变量 它的特点就是 在任何地方都可以访问得到。
注 : 针对上示 # 也要提到一些内容 :
在我们系统中有三种用户类型 :
超级用户(超级管理员用户 root);
普通用户
系统用户(这个不需要管,这是在安装系统的时候就已经创建
的用户)
所以,我们经常要用到的用户就是 超级用户 和 普通用户了;
所以需要注意到的是 : 有针对某一个用户的环境变量,也有针对所
有用户的环境变量,这两个概念是完全不一
样的!!!!
分类 : 环境变量可以分为 自定义环境变量 和 bash 内置的环境变量
bash 内置的环境变量 : 用于定义 SHELL 的运行环境,保证 SHELL 命令
的正常执行,SHELL 通过环境变量来确定 :
登录用户名、命令路径、终端类型、登录目录等。
自己定义的环境变量 : 自定义环境变量可以在命令行中设置和创建,但用
户退出命令时这些变量值就会丢失。如果希望
永久保存环境变量,可以在用户 家目录下的
.bash_profile 或 .bashrc 文件中,或者全局配置
/ etc / bashrc 或 / etc / profile 文件中定义,在将
环境变量 放入上述 文件中后,每次用户登录时这
些变量都将被初始化。
注 : 针对 自定义的环境变量,我们要重点放在 :
在哪进行自定义 ??
怎么定义变量?? 格式是什么??
首先 自定义变量 分为两种 : 临时定义 永久定义
# 临时定义 : 在命令行中定义
特点 : 就是临时性,只要用户一退出,定义的变量就将不
复存在,下次想访问变量,则没法访问!!
格式 : 变量=值
示例 :
注 : 上示 显然,我们在命令行中就进行了 变量的定义
并进行访问,定义 变量 Bliang_1 给其赋值为 888
然后,访问成功了,接着,断开了连接,然后再进
行访问变量 Bliang_1 看看是什么结果,还能访问成
功嘛?请看下图
显然,当断开链接后,再次访问 变量 Bliang_1,则
访问失败,没有访问到 变量值!!!
综上 : 就是 临时变量的定义格式及特点!!
# 永久定义 : 用户家目录 .bash_profile .bashrc
全局配置 /etc/profile /etc/bashrc
永久定义的两种 : 用户家目录 和 全局配置它们的区别就在于 环境变量的适用
范围,当在用户家目录去定义的时候,说明什么,说明定义
的这个环境变量只能针对于你此时此刻的用户起作用,对于
其它用户是没有作用的,也就是说,只能在此时的用户下去
使用这个环境变量!!!其它的用户则不行!!!!
了解文件 : 我们先来看看 .bash_profile .bashrc /etc/profile
/etc/bashrc 里面的内容
用户家目录 : .bash_profile .bashrc
.bash_profile :
# 可以看到 文件里面 还包含这一层关系(if 语句)
if 语句里面 告诉我们的就是 :
当执行 .bash_profile 的时候,如果里面包含
了 .bashrc 则也执行 .bashrc 。
就是说: 在执行 .bash_profile 的时候,也会
顺便执行 .bashrc !!!!
# 还圈住了一个内容(PATH)就是告诉我们 :
变量是如何定义的 ????
NO 1 :
变量=值
export 变量
NO 2 :
export 变量=值
NO 3 :
declare -x 变量=值
再来看 .bashrc
.bashrc
# 在文件里还可以看到 白圈里的内容是我们 命令的别名的
内容: 这就说明 我们在执行 rm cp mv 时,实际执行的
是加了 -i 的命令!!
我们在这个文件 .bashrc 找到了 命令别名的根本因
也就是说当我们 使用 root 用户或者 其它用户登陆的时
候系统就已经为我们加载了 这些环境变量,因此,才能
在我们想要使用这些命令 rm cp mv 的时候 实际上才能
够起到 -i 的作用!!
# 从 if 语句(红圈)就能够看到,当执行 .bashrc 的时
候,还要执行 /etc/bashrc !!!!
然而, /etc/bashrc 是干什么的?? 它是存储全局配置的
也就是说 /etc/bashrc 定义的东西是真对所有用户的!!
然而现在 : 我们家目录下的 .bashrc 当执行的时候还要
执行下 /etc/bashrc 意味什么
意味着 :
在我们当前用户家目录里面的环境变量的设
置里去加载了全局的环境变量(也就是针对
所有用户的环境变量加载了下来)
再换言之 :
所谓的所有用户那肯定也包含着我 root
(即就是 当前用户,就你现在此时此刻的用
户)
再意味着 : 当前用户 即可以获取全部用户的环境变量
也有自己独有的环境变量!!!
公有的和独有的加在一起我都有!!!!
注 : 上面几句话不是很好理解,需要反复理解!!!
全局配置 : / etc/ profile / etc/ bashrc
/etc/profile :
可以看到,在执行 /etc/profile 顺便也会执行 /etc/bashrc
/etc/bashrc :
可以看到 此文件下面没有再需要执行的文件了!!
文件关系 :
执行顺序 : 先加载 /etc/profile 再加载 .bash_profile,在
.bash_profile 下再加载 .bashrc 继而加载
/etc/bashrc
还有一条路线是 /etc/profile 下有 /etc/profile.d
/etc/profile.d 这是个目录,主要是存储执行的脚
本文件 它里面的 .d 就是存放环境变量的一些
可执行的脚本 !!!!
综上 : 上述全部的全部需要搞清下示几个问题(关于那四个文
件)
NO 1 : 如果我要定义针对所有用户的环境变量,我
应该写在哪??
NO 2 : 如果我要定义某一个用户的环境变量,我应
该写在哪??
上图 : 也是 几个文件的相互关系,箭头的指向就是先执行后
执行的顺序。
因此 : 可以解答 上示的 两个问题 !!!
针对所有用户的环境变量 :
.bash_profile 或者 .bashrc
针对某一个用户的环境变量 :
/etc/profile 或者 /etc/bashrc 再或者 /etc/profile.d
综上的综上 : 就是当你想要定义一个环境变量的时候
首先 ,思考要定义临时的环境变量还是 永久的环境变量,
如果是 临时环境变量,那没啥可说的,直接命令行定义就好,
如果是 永久环境变量,那么则,思考是要所有用户都可以访问的环
境变量还是只要当前用户可以访问就行!!!!
如果是 所有用户都可以访问则在 /etc/profile 或者 /etc/bashrc 文件
里进行 自定义环境变量
如果是 只要某一个用户访问,则在 .bash_profile 或者 .basdrc 文件
里进行定义!!!
命令定义的格式 前面已经提过,就是那三种格式!!!!
环境变量实操 :
只某一用户使用 : 在 .bash_profile 进行 变量定义
访问变量 :
可以看到当 在 .bash_profile 定义变量后,我们需要再使用source
对文件进行一个加载,而后再访问 变量即成功!!!
针对所有用户 : 在 / etc /profile 进行变量定义
访问变量 :
显然,也可以看到,当在文件定义完 变量后,也要用 source
重新进行加载,而后访问成功!!!!