什么是 Shell 变量
在初等数学数学方程式中, 我们会经常碰到类似于这样的方程式: y=x+1 , 等号左右两边的 x 和 y 称之为未知数. 在编程里面它们他们则代表变量名与变量值.
通过该示例, 我们可以得出一个结论: 简单来说, 变量是编程中最基本的存储单位, 它会暂时存储用户放进去的数据, 而存储的数据位于内存空间中, 通过正确调用内存空间中变量名字即可以取出与之对应的数据. 在 Shell 中定义变量和取值如下所示:
变量注意事项
1, 定义变量的方法, 先定义变量名, 紧跟赋值操作符 =, 最后是变量对应的值, 中间不能存在空格, 否则会出现报错, 这一点是跟其他语言比较大的区别, 如下所示:
2, 打印变量值, 需要在变量名前加 $ 或 ${}, 如下所示:
- echo $y
- echo ${y}
3, 变量名只能为字母, 数字或下划线且只能以字母或下划线开头(这一点跟大多数语言一样, 至于为什么请问度娘)
4, 变量名需要遵循一定的规范, 并且要一见名便知其意.
常见的命令规范有三种:
匈牙利命名法
该命令方法是在每个变量名前添加表示数据类型的字符
驼峰命名法
混合使用大小写字母来对变量进行命名. 而且是首字母小写, 后续单词第一个字母大写, 如 userName
帕斯卡命名法
与驼峰法很很像, 每个单词第一个字母均大写, 如 UserName
5, 环境变量需要全部采用大写形式书写
6, 在其他强类开语言中 (如 Java/C#) 对数据类型都有其严格的定义, 如整型 int, 字符 char, 字符串 string, 小数 float/double/decimal 等等. 而在 Shell 中, 默认是不区分变量类型的. 如果需要显式定义变量类型, 则可以使用 declare 定义.
7, 如果要在 crond 做定时任务时需要在 Shell 脚本中使用环境变量需要先在执行脚本中重新定义
变量类型
变量可分为两类: 环境变量 (全局变量) 和普通变量(局部变量), 而环境变量又可以分为 bash 内置环境变量和用户自定义环境变量. 详细可参考下图所示:
环境变量(全局变量): 可以在创建它们的 Shell 和其任意子 Shell 进程中使用
普通变量(局部变量): 仅能在创建它们的 Shell 函数和脚本中使用
内置环境变量
环境变量一般是指使用 export 内置命令导出的变量, 用于定义 Shell 的运行环境, 保证 Shell 命令的正确执行. Shell 通过环境变量来确定登录用户名, 命令路径, 终端类型, 登录目录等, 所有的环境变量都是系统全局变量, 可用于所有子进程中.
环境变量可以在命令行中设置和创建, 但在用户退出命令行时这些变量值就会丢失. 如果希望永久保存环境变量, 可以在用户目录下的. bashrc 或. bash_profile 文件中或全局变量配置 / etc/profile 文件中定义. 在将环境变量放入上述文件后, 每次用户登录时这些变量都将被初始化.
1, 按照系统规范, 所有环境变量的名字必须采用大写形式
2, 在将环境变量应用于用户进程程序之前, 都应该用 export 命令导出定义. 如 export JAVA_HOME
3, 有部分环境变量, 如 HOME,PATH,SHELL,UID,USER 等, 的用户登录之前就已经被 / bin/login 程序设置好了. 通常环境变量被定义并保存在用户目录下的. bash_profile 或 / etc/profile 中.
4, 在查看设置的变量时, 有 3 个命令可显示变量的值: set,env,declare
set: 输出所有的变量, 包括全局变量和局部变量
env: 只显示全局变量
declare: 输出所有的变量, 函数, 整数和已经导出的变量
set -o: 显示 bash Shell 的所有参数配置信息
env 查看系统环境变量:
declare 查看所有变量, 函数, 整数等
set 输出所有变量
set -o 输出 bash 参数配置
自定义环境变量
设置环境变量
如果想要设置环境变量, 就要在给变量赋值前之后或在设置变量时使用 export 命令, 除 export 命令, 使用 declare -x 命令也可以实现同样的功能. 示例如下:
export JAVA_HOME=/usr/local/java
或
JAVA_HOME=/usr/local/java;export JAVA_HOME
或
declare -x JAVA_HOME=/usr/local/java
以上为设置自定义环境变量的 3 种方法, 而在此处不要在变量名前添加 $
自定义环境变量示例
接下来我们来看看让环境变量永久生效的常用设置文件
1, 用户的环境变量配置
对于用户环境变量的设置, 比较常见的是用户目录下的. bashrc 和. bash_profile. 推荐在~/.bash_profile 中进行设置.
2, 全局变量配置
常见的全局环境变量的配置文件有 / etc/profile,/etc/bashrc,/etc/profile.d
若要登录后初始化或显示加载内容, 则把脚本文件放在 / etc/profile.d 下即可, 无须添加执行权限.
示例一: 设置登录提示
以上任意一种方法均可, 上面是两种方法合并处理进行演示. 实际操作只需要在一个文件中操作即可.
示例二: 在 Linux 中设置 Java 环境变量
- export JAVA_HOME=/usr/local/java/jdk1.7.0_09
- export JRE_HOME=/usr/local/java/jdk1.7.0_09/jre
- export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- export PATH=$PATH:$JAVA_HOME/bin
显示环境变量
通过 echo 和 printf 显示环境变量
首先我们来显示一些常见的变量
从上面可以看出显示环境变量可以使用 echo 和 printf . 其中 printf 是一种比较复杂的格式化打印工具. 如果感兴趣可以查看相应的资料.
通过 env,set 和 declare 显示默认的环境变量
可查看前面所讲内容
取消环境变量
如果定义了环境变量, 不想使用, 是否可以消除环境变量定义了? 在这里我们可以使用 unset 命令.
- [root@localhost ~]# echo $USER
- root
- [root@localhost ~]# unset USER # 清除变量, 注意变量前面没有 $
- [root@localhost ~]# echo $USER
- # 输出为空白
普通变量
定义本地变量
本地变量仅在用户当前 Shell 中有效, 如果在 Shell 中启动另一个进程或退出, 则变量无法进行传递.
变量的定义及赋值如下所示:
- var=value # 定义变量并进行赋值, 此时没有引号
- var='value' # 定义变量并进行赋值, 此时有单引号
- var="value" # 定义变量并进行赋值, 此时有双引号
- var=`value` # 定义变量并进行赋值, 此时有反引号
以上变量赋值的区别如下所示:
无引号: 一般常用于连续的字符串, 数字, 路径等进行赋值. 但如果变量中含有空格, 则会导致赋值不完整, 无法输出完整的变量值
单引号: 所见即所得, 即输出时会将单引号中的所有内容原样输出, 不做任何转义和解释, 因此称之为强引用
双引号: 输出引号中间的全部内容, 如果引号中含有变量, 特殊转义字符, 命令 (需要使用反引号) 等会先把变量, 转义字符, 命令进行解析再输出内容, 因此称之为弱引用
反引号: 常用于引用命令, 即反引号中的内容会被当作命令进行解析输出, 相当于 $()
以上四种赋值方法, 数值内容进行赋值可以不加引号, 其他若没有特殊要求的情况, 建议进行赋值均采用双引号
定义本地变量输出
方法一 | 关系 | 方法二 |
---|---|---|
$a | 等效于 | ${a} |
`pwd` | 等效于 | $(pwd) |
以上两种输出变量值建议采取第二种方法, 原因如下所示:
如以用户名 + rc 文件夹, 定义变量 $usernamerc, 如这样写会导致变量为 usernamerc, 如果写为 ${username}rc, 则可以很明显的看出变量为 username
``, 反引号容易与单引号引起混淆
定义本地变量示例
- [root@localhost Test]# a=718
- [root@localhost Test]# b='718'
- [root@localhost Test]# c="718"
- [root@localhost Test]# d=`date +%F`
- [root@localhost Test]# echo $a
- 718
- [root@localhost Test]# echo $b
- 718
- [root@localhost Test]# echo $c
- 718
- [root@localhost Test]# echo ${
- c
- }
- 718
- [root@localhost Test]# echo $d
- 2018-11-02
- [root@localhost Test]# echo $(date +%F)
- 2018-11-02
- [root@localhost Test]# a=823-$a
- [root@localhost Test]# b='823-$a'
- [root@localhost Test]# c="823-$a"
- [root@localhost Test]# echo $a
- 823-718
- [root@localhost Test]# echo $b
- 823-$a
- [root@localhost Test]# echo $c
- 823-823-718
- [root@localhost Test]# echo ${
- c
- }
- 823-823-718
- [root@localhost Test]# path=`pwd`
- [root@localhost Test]# echo $path
- /root/Test
环境变量初始化及其对应文件的生效顺序
在登录 Linux 系统后, 会默认启动一个 Shell, 此时 Shell 会在各个配置文件中查找并使用对应的环境变量设置. 而 Shell 所使用的环境变量取决于 Shell 的运行方式, 通常分为以下三种:
通过系统用户登录后默认运行的 Shell
非登录交互式运行的 Shell
执行脚本运行的非交互式 Shell
当用户是通过登录 Linux 系统, 此时 Shell 会作为登录 Shell 启动, 此时加载环境变量的顺序如下所示:
详细解释如下所示:
1, 用户登录系统后会首先加载 / etc/profile 全局变量文件.
/etc/profile 是 Linux 默认的 Shell 主环境变量文件, 系统上每个用户登录都会加载该文件.
2, 当加载完 / etc/profile 文件后, 会执行加载 / etc/profile.d 目录中的脚本文件.
/etc/profile.d 目录中有很多脚本文件, 如果需要自定义登录即运行脚本, 可以将自己的脚本放置到该目录中.
3, 前面加载完成后, 开始加载~/.bash_profile(用户环境文件), 而该文件又会分别加载~/.bashrc 和 / etc/bashrc 文件. 如果这些文件存在, 则执行, 如没有, 则不执行.
如果用户的 Shell 不是登录启动时(如 SSH 远程连接), 此时这种非登录 Shell 只会加载 $HOME/.bashrc, 不会去查找 / etc/bashrc, 如果需要加载这些配置, 则需要将变量设定等写入 $HOME/.bashrc 或者 / etc/bashrc 中. 而不是 $HOME/.bash_profile 或者 / etc/profile.
来源: https://www.cnblogs.com/surpassme/p/9926088.html