复习之变量
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