第二章 Shell变量的核心基础知识和实践
1 什么是shell变量
变量是暂时存储数据的地方及数据标记,所存储的数据存在于内存空间中,通过调用内存空间中的数据来实现变量。
其实简单点来说就是我们小学时候学的数学方程式,列如:x=1,y=x+1,那么y等于什么?
以上这个列子x和y我们可以看做是变量,等号右边的数值就是变量的赋值。
1.1 变量的类型
在shell中变量可分为两类:环境变量和普通变量
环境变量也可以成为全局变量。可以在创建它们的shell及其子shell中使用。
普通变量也可称为局部变量,只能在创建它们的shell函数或shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。
1.2 如何查看系统中的变量
- set:输出所有变量,包括全局变量、局部变量
- env:只显示全局变量
- declare:输出所有的变量,如同set
- export:显示和设置环境变量值
1.2.1 自定义环境变量
1、设置环境变量:如果想要设置环境变量,我们可以使用export命令
但是在命令行定义的变量,只在当前shell有效,要想永久有效,就要在/etc/profile或者/etc/bashrc中写入。
2、显示与取消环境变量
1)通过echo命令打印环境变量
2)通过env或者set来显示环境变量
3)用unset来取消本地变量和环境变量
1.3 常见环境变量
1.4 环境变量知识小结
- 变量名通常要大写
- 变量可以在自身的shell及子shell中使用
- 常用export来定义环境变量
- 执行env默认可以显示所有的环境变量名称及对应的值
- 输出时用”$变量名”,取消时用unset变量名
- 书写定时任务的时候,脚本要用到的环境变量最好先在所执行的shell脚本中重新定义
- 如果希望永久生效,则可以将其放在用户环境变量文件或全局变量文件中
1.5 普通变量
1.5.1 普通变量的定义
1、普通变量的定义赋值,一般有以下3种方法:
NAME=xujun
NAME='xujun'
NAME="xujun"
2、在shell中定义变量名和变量内容赋值的要求
变量名一般是由数字,英文,下划线组成。开头必须是字母或者数字,不能是特殊符号。
1.5.2 变量定义的基本技巧
第一种定义的方式是不加任何符号,当内容为简单连续的数字、字符串、路径名时,可以这样用
第二种定义的方式是加单引号,单引号是强引用,单引号里的内容是什么,输出的结果就是什么
第三种定义的方式是加双引号,双引号是弱引用,它会引用变量里的赋值。
1.5.3 变量定义及赋值的经验小结
- 若变量内容为连续的数字或字符串,赋值时,变量内容两边可以不加引号,列如:a=123
- 变量的内容很多时,如果有空格或者其他特殊字符的时候,就要加双引号,列如:
- 希望原样输出变量,就用单引号
- 希望变量的内容是命令的解析结果,就要使用反引号,列如:
a=`ls`
或者使用$()
a=$(ls)
- 使用“echo 变量名”来解析变量的内容
- $dbname_tname,当变量后面连接有其他字符的时候,就必须给变量加上大括号或者双引号,列如:
笔者的建议:
- 在脚本中定义普通字符串变量时,应尽量把变量的内容用双引号括起来
- 单纯数字的变量内容可以不加括号
- 希望变量的内容原样输出时需要加单引号
- 希望变量值引用命令并获取命令的结果时就用反引号或$()
注意:在shell脚本中使用awk命令的时候,awk用以上三种符号和普通的都是相反的
1.6 Linux环境变量及其加载顺序
- /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置。
- /etc/bashrc:为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取
- ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
- ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。
- ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件。
加载顺序
/etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~/.bashrc → /etc/bashrc
1.7 变量定义技巧总结
- 变量名及变量内容定义小结
- 变量名只能为字母、数字或下划线,只能以字母或下划线开头
- 名称定义要做到见名知意,切不得引用保留关键字
- 不能以数字开头
- 不能用标点符号
- 变量名严格区别大小写
- 一般的变量定义、赋值常用双引号。简单连续的字符串可以不加引号,希望变量原样输出的就用单引号
- 希望变量的内容是命令的解析结果时,要用反引号``,或者用$()
- shell定义变量时使用“=”,“a=1”里等号是赋值的意思
- 打印输出或使用变量时,变量名前要接$符号。变量名后面紧接其他字符的时候,要用大括号将变量部分括起来
- 打印输出或使用变量时,一般加双引号或不加双引号。如果是字符串变量,最好加双引号,希望原样输出使用单引号