首页 > 技术文章 > 复习之变量

weilanxuesre 2022-02-23 23:33 原文

1.变量

变量是shell中经常用到的,事实上常见的各种开发语言都支持变量。那么什么是变量?顾名思义即变化的数据。使用变量可以实现灵活的数据处理。

在bash中变量分为内置变量和自定义变量。内置变量,即bash中自身带有的变量,通常是为了实现shell中特定功能。而自定义变量,即用户根据自己的需要而实现的。

变量用处之一是在程序中可以多次引用同一个变量,仅需要修改变量的值,即可实现多出对同一个变量引用的更新。变量还有一个好处是把一个非常长的字符串,赋值给一个短小的变量名,方便使用。

 

2.变量赋值和引用

在bash中使用变量,须先对变量进行定义,又称为赋值。变量可以表示一些文字或符号。

变量赋值格式:

变量名=变量对应的值

比如:对name变量赋值为magedu:

[root@centos8 ~ 816]#name=magedu

注意:等号两边不能有空格符。

变量引用格式:

  当想引用变量时,需要在变量前加$

比如:用echo命令显示name变量值:

[root@centos8 ~ 817]#echo $name
magedu

删除自定义的变量格式:

[root@centos8 ~ 819]#unset name

变量的使用需符合下面一些规则:

  1.变量名只能包含英文字母、数字及下划线,但不能以数字开头。

  2.不要使用shell中的命令和关键字作为变量,如:if,do等。

  3.变量内容如有空格,可使用双引号或单括号括起来。

  4.转义符(\)的使用:将一些特殊符号显示为字面本身的符号,如Enter键、$、\、空格符、单引号(‘)等变成一般符号。

  5.如果变量没有赋值直接引用,其值为空,即为null。

  6.变量引用时,若变量名和其他字符相连,需要用$(变量名)。

范例:自定义变量

[root@centos8 ~ 820]#NAME=wangxiaochun
[root@centos8 ~ 821]#echo $NAME
wangxiaochun
[root@centos8 ~ 822]#VAR=hello magedu  <==变量内容中有空格特殊符号时,需要用引号引起来
bash: magedu: command not found...
[root@centos8 ~ 823]#VAR="hello magedu"
[root@centos8 ~ 824]#echo $VAR
hello magedu
[root@centos8 ~ 825]#PAY=$10000  <==要使用$本身意义时,需要在前面加转义字符"\"
[root@centos8 ~ 826]#echo $PAY
0000
[root@centos8 ~ 827]#PAY=\$10000
[root@centos8 ~ 828]#echo $PAY
$10000
[root@centos8 ~ 829]#echo $NAME$PAY
wangxiaochun$10000
[root@centos8 ~ 830]#echo $NAME_$PAY
$10000
#变量引用时,有时需要加"{}"将变量和其他字符分隔,以区分变量和字符
[root@centos8 ~ 832]#echo ${NAME}_$PAY
wangxiaochun_$10000

 

3.变量的分类

在Bash中根据变量的有效范围可分为普通变量、环境变量、本地变量三种。每种变量都有自己的作用域即使用范围。

普通变量作用域为当前shell进程,不包括子进程,注意所有的普通变量在shell进程终止时,会被自动撤销。

环境(全局)变量作用域为当前shell进程及其子进程,需要使用关键字export或declare -x来声明,才可以成为环境变量。

本地变量作用域即可引用到的范围,比如函数(以后再复习)。需要使用关键字local来声明才成为本地变量。

声明变量为环境变量的格式:

export 变量名

声明本地变量格式:

local 变量名

显示所有环境变量相关命令:export,declare -x,env

显示所有变量和函数:set

范例:自定义普通和环境变量

#变量普通变量
[root@centos8 ~ 833]#NAME=magedu
[root@centos8 ~ 834]#echo $NAME
magedu
[root@centos8 ~ 835]#bash <==开启新的子shell
[root@centos8 ~ 816]#echo $NAME
     <==显示为空,说明普通变量无法在子shell中使用
#退出子shell
[root@centos8 ~ 817]#exit
exit
#将NAME变量声明为环境变量
[root@centos8 ~ 836]#export NAME
[root@centos8 ~ 837]#bash
[root@centos8 ~ 818]#echo $NAME
magedu <==环境变量可以在子shell中使用
#显示所有环境变量
[root@centos8 ~ 819]#export
.......(省略)

根据变量的可否修改,又分为只读变量和可修改变量,用户自定义默认为可修改变量,如果要定义为只读,需要加readonly关键字声明。

声明只读变量格式:

readonly 变量名

显示所有只读变量相关命令:readonly或declare -r

范例:只读变量

[root@centos8 ~ 820]#PI=3.14
[root@centos8 ~ 821]#PI=3.1416
[root@centos8 ~ 822]#echo $PI
3.1416
#声明PI为只读变量
[root@centos8 ~ 823]#readonly PI 
[root@centos8 ~ 824]#PI=3.1415926 <==不能修改只读变量
bash: PI: readonly variable
[root@centos8 ~ 825]#unset PI <==不能删除只读变量
bash: unset: PI: cannot unset: readonly variable
[root@centos8 ~ 826]#echo $UID
0
[root@centos8 ~ 827]#UID=1000
bash: UID: readonly variable

 

4.常见的系统内置变量介绍

系统内置变量中有一些特殊的变量,实现shell的特定功能。如PSI,SHELL,$$,USRE,HOME等,下面介绍几个常见的系统内置的特殊变量:

  UID:当前用户的UID

  HOME:代表当前用户的家目录。可使用cd~或cd命令也可切换到用户家目录。

  SHELL:当前使用shell的类型。

  BASHPID:当前BASH的进程编号即PID。

  HISTSIZE:记录命令历史的数目。

  MAIL:当前用户的邮件信箱文件存储目录。

  PATH:执行文件的搜索路径。目录之间以冒号分隔,搜索是按路径是顺序目录来查询的,所以目录的顺序也很重要。

  LANG:系统使用的语言及编码字符集,很多数据都会用到它,可以用locale -a命令,查看系统支持的所有语系编码:如果发生一些乱码问题,设置系统使用的语系编码应该就可以解决;要设置永久生效CentOS7需要修改/etc/locale.conf 文件(CentOS6则是/ect/sysconfig/il8n文件),把要设置的编码字符集写入该文件即可,例如:该文件内容可为:LANG="en__US.UTF-8"。也可以通过localectl命令进行管理和字符集。

  RANDOM:生成随机数字的变量,该变量取值的范围0-32767之间。

  PSI:命令提示符。

  OSTYPE:操作系统类型,例如:执行命令echo $OSTYPE,显示结果为linux-gnu。

  HOSTTYPE:主机类型,例如:执行命令echo $HOSTTYPE,显示结果为x86_64。

  MACHTYPE:机器类型,例如:执行命令echo $MACHTYPE,显示结果为x86_64-redhat-linux-gnu。

范例:查看和修改PATH变量

[root@centos8 ~ 835]#echo $PATH
/apps/httpd/bin:/apps/cmatrix/bin:/apps/httpd/bin:/apps/cmatrix/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos8 ~ 836]#PATH=$PATH:/app/bin
[root@centos8 ~ 837]#echo $PATH         
/apps/httpd/bin:/apps/cmatrix/bin:/apps/httpd/bin:/apps/cmatrix/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/app/bin

范例:查看和修改LANG变量

#查看语言和字符集,显示是英语,和UTF-8字符集
[root@centos8 ~ 838]#echo $LANG
en_US.UTF-8
#列出所有支持的语言和字符集
[root@centos8 ~ 841]#localectl list-locales
(略)
#查看对应的配置文件
[root@centos8 ~ 842]#cat /etc/locale.conf
LANG="en_US.UTF-8"
#修改为中文语言
[root@centos8 ~ 846]#localectl set-locale LANG=en_HK.utf8
[root@centos8 ~ 847]#echo $LANG
en_US.UTF-8 <==没有立即生效
[root@centos8 ~ 848]#cat /etc/locale.conf
LANG=en_HK.utf8 <==修改了对应的配置文件
[root@centos8 ~ 849]#exit
[root@centos8 ~ 880]#echo $LANG
en_HK.utf8 <==重新登陆后,生效

 

5.执行状态结果变量

在bash中的命令执行后,通常会返回一些执行结果,我们通常观察来判断命令的成功或失败。实际上命令执行完成后,还会生成一个状态码,也称为执行状态结果,但是这个状态结果不直接显示在屏幕上,它保存在特殊变量“$?”中。此变量会保存最近一次执行的命令的状态结果。此值的范围为0-255的整数,其中0表示前一个命令执行成功,1-255表示前一个命令出现的各种错误。另外在shell脚本编程中可以在脚本中用exit N,指定脚本返回状态码。

可以用echo $?查看结果值。

范例:显示执行状态结果

[root@centos8 ~ 882]#ls abc.txt
abc.txt
[root@centos8 ~ 883]#echo $?
0
[root@centos8 ~ 884]#ls error.txt
ls: cannot access 'error.txt': No such file or directory
[root@centos8 ~ 885]#echo $?     
2

推荐阅读