什么是Shell变量

    在初等数学数学方程式中,我们会经常碰到类似于这样的方程式:y=x+1 ,等号左右两边的xy称之为未知数。在编程里面它们他们则代表变量名与变量值。

    通过该示例,我们可以得出一个结论:简单来说,变量是编程中最基本的存储单位,它会暂时存储用户放进去的数据,而存储的数据位于内存空间中,通过正确调用内存空间中变量名字即可以取出与之对应的数据。在Shell中定义变量和取值如下所示:

变量注意事项

1、定义变量的方法,先定义变量名,紧跟赋值操作符=,最后是变量对应的值,中间不能存在空格,否则会出现报错,这一点是跟其他语言比较大的区别,如下所示:

2、打印变量值,需要在变量名前加$${},如下所示:

  1. echo $y
  2. 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
  1. set:输出所有的变量,包括全局变量和局部变量
  2. env:只显示全局变量
  3. declare:输出所有的变量、函数、整数和已经导出的变量
  4. set -o:显示bash Shell的所有参数配置信息

env查看系统环境变量:

declare查看所有变量、函数、整数等

set输出所有变量

set -o输出bash参数配置

自定义环境变量

设置环境变量

    如果想要设置环境变量,就要在给变量赋值前之后或在设置变量时使用export命令,除export命令,使用declare -x命令也可以实现同样的功能。示例如下:

  1. export JAVA_HOME=/usr/local/java

  2. JAVA_HOME=/usr/local/java;export JAVA_HOME

  3. 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环境变量

  1. export JAVA_HOME=/usr/local/java/jdk1.7.0_09
  2. export JRE_HOME=/usr/local/java/jdk1.7.0_09/jre
  3. export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  4. export PATH=$PATH:$JAVA_HOME/bin
显示环境变量
  • 通过echo和printf显示环境变量

  首先我们来显示一些常见的变量

从上面可以看出显示环境变量可以使用 echoprintf 。其中printf是一种比较复杂的格式化打印工具。如果感兴趣可以查看相应的资料。

  • 通过env、set和declare显示默认的环境变量

  可查看前面所讲内容

取消环境变量

    如果定义了环境变量,不想使用,是否可以消除环境变量定义了?在这里我们可以使用 unset 命令。

  1. [root@localhost ~]# echo $USER
  2. root
  3. [root@localhost ~]# unset USER # 清除变量,注意变量前面没有 $
  4. [root@localhost ~]# echo $USER
  5. # 输出为空白
普通变量
定义本地变量

    本地变量仅在用户当前Shell中有效,如果在Shell中启动另一个进程或退出,则变量无法进行传递。

  • 变量的定义及赋值如下所示:

var=value # 定义变量并进行赋值,此时没有引号

var='value' # 定义变量并进行赋值,此时有单引号

var="value" # 定义变量并进行赋值,此时有双引号

var=`value` # 定义变量并进行赋值,此时有反引号

以上变量赋值的区别如下所示:

  • 无引号:一般常用于连续的字符串、数字、路径等进行赋值。但如果变量中含有空格,则会导致赋值不完整,无法输出完整的变量值
  • 单引号:所见即所得,即输出时会将单引号中的所有内容原样输出,不做任何转义和解释,因此称之为强引用
  • 双引号:输出引号中间的全部内容,如果引号中含有变量、特殊转义字符、命令(需要使用反引号)等会先把变量、转义字符、命令进行解析再输出内容,因此称之为弱引用
  • 反引号:常用于引用命令,即反引号中的内容会被当作命令进行解析输出,相当于$()

以上四种赋值方法,数值内容进行赋值可以不加引号,其他若没有特殊要求的情况,建议进行赋值均采用双引号

定义本地变量输出
方法一 关系 方法二
$a 等效于 ${a}
`pwd` 等效于 $(pwd)

以上两种输出变量值建议采取第二种方法,原因如下所示:

  • 如以用户名+rc文件夹,定义变量$usernamerc,如这样写会导致变量为usernamerc,如果写为${username}rc,则可以很明显的看出变量为username
  • ``,反引号容易与单引号引起混淆
定义本地变量示例
  1. [root@localhost Test]# a=718
  2. [root@localhost Test]# b='718'
  3. [root@localhost Test]# c="718"
  4. [root@localhost Test]# d=`date +%F`
  5. [root@localhost Test]# echo $a
  6. 718
  7. [root@localhost Test]# echo $b
  8. 718
  9. [root@localhost Test]# echo $c
  10. 718
  11. [root@localhost Test]# echo ${c}
  12. 718
  13. [root@localhost Test]# echo $d
  14. 2018-11-02
  15. [root@localhost Test]# echo $(date +%F)
  16. 2018-11-02
  17. [root@localhost Test]# a=823-$a
  18. [root@localhost Test]# b='823-$a'
  19. [root@localhost Test]# c="823-$a"
  20. [root@localhost Test]# echo $a
  21. 823-718
  22. [root@localhost Test]# echo $b
  23. 823-$a
  24. [root@localhost Test]# echo $c
  25. 823-823-718
  26. [root@localhost Test]# echo ${c}
  27. 823-823-718
  28. [root@localhost Test]# path=`pwd`
  29. [root@localhost Test]# echo $path
  30. /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。

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

Shell编程-02-Shell变量的更多相关文章

  1. Linux shell编程02 shell程序的执行 及文件权限

    第一个shell脚本 1.       shell编程的方式 交互式shell编程 非交互式shell编程:执行的语句存放到一个文件 shell脚本:可以任意文件名,建议扩展名为sh 2.       ...

  2. Linux学习——shell编程之环境变量配置文件

    小白学习,在学习中总结! shell编程之环境变量配置文件 一:环境变量配置文件 1 shell编程之环境变量配置 变量类型: 用户自定义变量(本地变量) 环境变量 :定义每个用户的操作环境,如pat ...

  3. shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~]# cat /server/scripts/show2.sh #!/bin/ ...

  4. 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    [转]shell编程下 特殊变量.test / [ ]判断.循环.脚本排错 第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~] ...

  5. 01 shell编程规范与变量

    前言: 大家对shell脚本应该都不算陌生了,如果突然问你什么是shell脚本?是干什么用的?由什么组成以及怎么使用?变量的概念是什么?作用范围是什么?变量间的算术运算怎么表示?你能很容易答出来吗 本 ...

  6. 【Shell编程】Shell程序设计

    1.Shell简介   作为Linux灵感来源的Unix系统最初是没有图形化界面的,所有的任务都是通过命令行来实现的.因此,Unix的命令行系统得到了很大的发展,逐步成为一个功能强大的系统.   Sh ...

  7. Shell 编程基础之变量和环境变量

    一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...

  8. shell编程之环境变量

    在shell编程里我们首先接触到的是环境变量,常用命令说明 1. 使用echo命令查看单个环境变量.例如: echo $PATH 2. 使用env查看所有环境变量.例如: env 3. 使用set查看 ...

  9. (一)Linux Shell编程——简介、变量、字符串、数组

    1. Shell简介 1.1 Shell出现背景 Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件. 对于图形界面,用户点击某个图标就能启动某个程序:对于命令行,用户输入某个程序的名字( ...

  10. SHELL编程规范与变量

    shell相比标准开发语言比如JAVA,C,C++来说还是比较简单的,其实就是一堆命令的集合而已,初学者从简单的shell脚本学起,至于shell编程还是要有编程思想在里面,因此,循序渐进很重要,先研 ...

随机推荐

  1. UE4关于Oculus Rift (VR)开发忠告

    转自:http://blog.csdn.net/cartzhang/article/details/42493843 UE4虚拟现实 实现的注意事项 https://docs.unrealengine ...

  2. 使用protocol buffer时关闭警告

    在生成的文件头尾添加屏蔽警告的代码. 头部: #pragma warning(push, 2) // --------------------------------------------- 尾部: ...

  3. 使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling

    [问题]使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling [原因] 这是因为 Python 包的版本问题,例 ...

  4. django-创建表的字段属性,表关系

    表的各种属性文档:null char ..., django与之对应的文档 https://docs.djangoproject.com/en/1.11/ref/models/fields/   英文 ...

  5. python实现进度条--主要用在上传下载文件

    在python中进行socket上传文件的时候使用进度条,然后在网上找了好久,找寻相关的进度的条的使用,看了几个,发现总是无法进行调用,主要原因是在进行上传文件的时候,每次传送的数据量是固定的,数据的 ...

  6. 「小程序JAVA实战」小程序的关注功能(65)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudeguanzhugongneng64/ 在个人页面,根据发布者个人和 ...

  7. asp.net webapi 参数绑定总结

    首先必须得更正下自己一直以来对于get请求和post请求理解的一个误区:get请求只能通过url传参,post请求只能通过body传参. 其实上面的理解是错误的,翻阅了不少资料及具体实践,正确理解应该 ...

  8. ArcGIS中各种合并要素(Union、Merge、Append、Dissolve)的异同点分析 转载

    标签: arcgis 杂谈 分类: GISArcGIS中将两个要素类合并成一个要素有Union.Dissolve.Append.Merge等,在Arctoolbox中均有相应工具,但功能上有所不同:U ...

  9. This usually happens because your environment has changed since running `npm install`

    此时运行按照提示执行  npm rebuild node-sass  命令,(如若不行,则先运行npm install node-sass命令执行) 然后再运行 node命令,启动服务.

  10. 使用net Manager工具配置远程连接oracle

    一,在服务端配置oracle端口在命令行中输入netca命令,打开相关配置默认端口号为1521 二,配置端口后使用Telnet工具调试端口是否联通 在命令行输入telnet 服务器ip 端口号 三,找 ...