变量、环境变量
简单一句话概括:"变量就是以一个较简单的字符串来替代某些具有特殊意义的设定以及数据"
变量的名称只能是英文、数字以及下划线_组成,而且不能以数字开头。
用户定义的局部变量或是shell脚本,最好使用小写字符。
变量名、等号和值之间没有空格。如果在复制表达式中加上了空格,bash shell就会把值当成一个单独的命令。
变量的显示:echo $变量 或 echo ${变量}
变量可作为命令行的参数使用:$变量
变量内容的添加:变量=${变量}添加的内容(注意没有空格)
用户定义局部变量(仅只在定义它的shell中使用,子shell或其他shell均不可用)
可通过export(导出)命令(也可用declare -x命令),将局部变量导出到全局环境中(子shell)(注销后未写入配置文件的新全局变量会失效)
格式:export 变量名称(注意:变量名前面不需要加$)
在子shell中修改了全局变量并不会影响到父shell中该变量的值(无法将效果反映到父shell中)
子shell同时也无法使用export命令来改变父shell中全局变量的值(export命令的作用范围只在执行它的那个shell中,在其他shell不起作用)
unset(复原):取消变量。格式:unset 变量名称(注意:变量名前面不要加$)
同样的,在子进程中取消/删除了一个全局变量,这操作只对子进程有效,不会影响父进程中该变量(无法将效果反映到父shell中)。该全局变量在父进程中依然可用。
read(读取):读取来自键盘输入的变量。格式:read [参数] [变量名]
-p:后面可接提示符
-t:后面可接等待时间(秒)
-r:允许输入包含反斜杠\(忽略其特殊字符的意义)
declare/typeset(声明):声明变量的类型。格式:declare [参数] [变量名]
+ / -:"-"减号用于指定变量的属性,"+"加号用于取消变量的属性
-a:变量定义为数组(array)类型
-i:变量定义为整数数字(integer)类型
(若不指定变量类型,默认为字符串类型)
(bash环境中的数值运算,默认最多仅能到达整数类型)
-x:相当于export命令,将变量导出为全局变量
-r:将变量设置为只读(readonly)类型,不可被更改内容,不能重设(注销再登录后才能复原该变量的类型)
+x:将全局变量变成局部变量(-p可单独列出变量的类型, -ir:整型只读)
数组(array)变量:形如 var[index]=content 或 var=(conten1 conten2 content3)格式的变量(index索引值从0开始)
输出格式:echo ${数组}
如果仅要用到(不进行操作)变量,变量名前要加$(如echo。而printenv这个命令例外,不加$);如果要操作(修改)变量,变量名前不加$(如export、unset、read、declare)。
环境变量
- 某些特定变量会影响到bash的环境。如PATH变量(能否在任何目录下执行某个命令与PATH变量有很大的关系),例如在执行ls这个命令时,系统就是通过PATH变量里面的内容所记录的路径顺序来查找命令的,如果在找完PATH变量内的路径都找不到ls这个命令时,就会在屏幕显示"command not found"的错误信息;
- 在Linux下,所有的执行都是需要一个执行码。用户真正以shell来跟Linux通信,是在正确的登录Linux之后。这个时候就拥有一个bash的执行程序,也才可以真正经由bash来跟系统通信。而在进入shell之前,由于系统需要一些变量(环境变量)来提供给它数据的访问(或者是一些环境的设置参数值,例如是否要显示彩色等的);
- 所以就有一些所谓的"环境变量"需要来读入系统中了,这些环境变量例如PATH、HOME、MAIL、SHELL等;
- 为了区别与自定义变量的不同,环境变量通常以大写字符来表示。
在bash shell中,Linux系统定义的环境变量分为两类:
(不同的LInux发行版可能会添加其自有的环境变量)
-
全局环境变量:对于shell会话和所有生成的子shell都是可见的
env(environment环境)或printenv命令可查看当前用户的全局变量
printenv命令可查看某个全局环境变量的值(注意:变量名前面不用加$)
全局环境变量可用于进程的所有子shell
(用bash命令生成一个shell后,再显示HOME这个全局环境变量的当前值,发现这个值和父shell中的值相同,都是/home/ysn)
-
局部环境变量:只对创建局部变量的shell(定义它们的进程中)可见(set命令可查看当前用户的所有变量,包括全局变量、局部变量以及用户定义变量)
10个比较重要的shell环境变量
变量名称 |
作用 |
HOME |
用户的主目录(即家目录)。 |
SHELL |
用户在使用的SHELL解释器名称。 |
HISTSIZE |
历史命令记录条数。 |
HISTFILESIZE |
历史命令记录条数。 |
|
邮件信箱文件保存路径。 |
LANG |
系统语言、语系名称。 |
RANDOM |
生成一个随机数字。 |
PS1 |
bash解释器的提示符。 |
PATH |
定义解释器搜索用户执行命令的路径。 |
EDITOR |
用户默认的文本编辑器。 |
? |
上一个执行命令的回传码 |
HOME:用户的主文件夹
LANG:语系数据
RANDOM:随机数(0-32767)
随机输出0-9之间的整数(declare -i number=$RANDOM*10/32767 ; echo $number)
HISTSIZE/HISTFILESIZE:最多在历史文件中存多少条命令
PS1:shell命令行界面的主提示符(如 [root@linuxprobe ~] )
\u:当前用户的账号名称,如root;
\h:仅取主机名在第一个小数点之前的名字,后面的省略;
\W:利用basename函数取得工作目录的基本名称(仅会列出最后一个目录名);
\$:提示符,root用户提示符为#,普通用户为$
\A:显示时间,24小时格式的"HH:MM",如22:52
(反斜杠\后面的数据是PS1的特殊功能,与"转义"无关)
SHELL:shell的绝对路径名
?:上一个执行命令的回传码。命令执行后都会回传一个执行后的代码。一般来说,如果成功执行该命令,则会回传一个0值;如果执行过程发生错误,就会回传非0数值的"错误代码"(127代表没找到命令)
个人用户自定义的命令别名、变量在注销bash后就会失效(个人永久性保留设置:将设置写入配置文件$HOME/.bashrc启动文件中)(全用户永久性保留设置:若希望更换用户后配置也仍然生效,则最好在/etc/profile.d目录中新建一个.sh结尾的文件,把新设置放在这个.sh文件中)