第二章 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命令

wps93E8.tmp.jpg

但是在命令行定义的变量,只在当前shell有效,要想永久有效,就要在/etc/profile或者/etc/bashrc中写入。

2、显示与取消环境变量

1)通过echo命令打印环境变量

2)通过env或者set来显示环境变量

3)用unset来取消本地变量和环境变量

1.3 常见环境变量

image-20211209235901145.png

1.4 环境变量知识小结

  • 变量名通常要大写
  • 变量可以在自身的shell及子shell中使用
  • 常用export来定义环境变量
  • 执行env默认可以显示所有的环境变量名称及对应的值
  • 输出时用”$变量名”,取消时用unset变量名
  • 书写定时任务的时候,脚本要用到的环境变量最好先在所执行的shell脚本中重新定义
  • 如果希望永久生效,则可以将其放在用户环境变量文件或全局变量文件中

1.5 普通变量

1.5.1 普通变量的定义

1、普通变量的定义赋值,一般有以下3种方法:

  1. NAME=xujun
  2. NAME='xujun'
  3. NAME="xujun"

2、在shell中定义变量名和变量内容赋值的要求

变量名一般是由数字,英文,下划线组成。开头必须是字母或者数字,不能是特殊符号。

1.5.2 变量定义的基本技巧

image-20220316125533170.png

第一种定义的方式是不加任何符号,当内容为简单连续的数字、字符串、路径名时,可以这样用

第二种定义的方式是加单引号,单引号是强引用,单引号里的内容是什么,输出的结果就是什么

第三种定义的方式是加双引号,双引号是弱引用,它会引用变量里的赋值。

1.5.3 变量定义及赋值的经验小结

  • 若变量内容为连续的数字或字符串,赋值时,变量内容两边可以不加引号,列如:a=123
  • 变量的内容很多时,如果有空格或者其他特殊字符的时候,就要加双引号,列如:
    image-20220316125603639.png
  • 希望原样输出变量,就用单引号
  • 希望变量的内容是命令的解析结果,就要使用反引号,列如:
    1. a=`ls`
    2. 或者使用$()
    3. a=$(ls)
  • 使用“echo 变量名”来解析变量的内容
  • $dbname_tname,当变量后面连接有其他字符的时候,就必须给变量加上大括号或者双引号,列如:

image-20220316125626738.png

笔者的建议:

  • 在脚本中定义普通字符串变量时,应尽量把变量的内容用双引号括起来
  • 单纯数字的变量内容可以不加括号
  • 希望变量的内容原样输出时需要加单引号
  • 希望变量值引用命令并获取命令的结果时就用反引号或$()

注意:在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

image-20220316133519125.png

1.7 变量定义技巧总结

  • 变量名及变量内容定义小结
    • 变量名只能为字母、数字或下划线,只能以字母或下划线开头
    • 名称定义要做到见名知意,切不得引用保留关键字
    • 不能以数字开头
    • 不能用标点符号
  • 变量名严格区别大小写
    • 一般的变量定义、赋值常用双引号。简单连续的字符串可以不加引号,希望变量原样输出的就用单引号
    • 希望变量的内容是命令的解析结果时,要用反引号``,或者用$()
  • shell定义变量时使用“=”,“a=1”里等号是赋值的意思
  • 打印输出或使用变量时,变量名前要接$符号。变量名后面紧接其他字符的时候,要用大括号将变量部分括起来
  • 打印输出或使用变量时,一般加双引号或不加双引号。如果是字符串变量,最好加双引号,希望原样输出使用单引号